NuPlayer.cpp revision c367ca1762278277fb7a7d1156ce6e193ab524a3
1/* 2 * Copyright (C) 2010 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 LOG_NDEBUG 0 18#define LOG_TAG "NuPlayer" 19#include <utils/Log.h> 20 21#include "NuPlayer.h" 22 23#include "HTTPLiveSource.h" 24#include "NuPlayerCCDecoder.h" 25#include "NuPlayerDecoder.h" 26#include "NuPlayerDecoderBase.h" 27#include "NuPlayerDecoderPassThrough.h" 28#include "NuPlayerDriver.h" 29#include "NuPlayerRenderer.h" 30#include "NuPlayerSource.h" 31#include "RTSPSource.h" 32#include "StreamingSource.h" 33#include "GenericSource.h" 34#include "TextDescriptions.h" 35 36#include "ATSParser.h" 37 38#include <cutils/properties.h> 39 40#include <media/AudioResamplerPublic.h> 41#include <media/AVSyncSettings.h> 42 43#include <media/stagefright/foundation/hexdump.h> 44#include <media/stagefright/foundation/ABuffer.h> 45#include <media/stagefright/foundation/ADebug.h> 46#include <media/stagefright/foundation/AMessage.h> 47#include <media/stagefright/MediaBuffer.h> 48#include <media/stagefright/MediaDefs.h> 49#include <media/stagefright/MediaErrors.h> 50#include <media/stagefright/MetaData.h> 51 52#include <gui/IGraphicBufferProducer.h> 53#include <gui/Surface.h> 54 55#include "avc_utils.h" 56 57#include "ESDS.h" 58#include <media/stagefright/Utils.h> 59 60namespace android { 61 62struct NuPlayer::Action : public RefBase { 63 Action() {} 64 65 virtual void execute(NuPlayer *player) = 0; 66 67private: 68 DISALLOW_EVIL_CONSTRUCTORS(Action); 69}; 70 71struct NuPlayer::SeekAction : public Action { 72 SeekAction(int64_t seekTimeUs) 73 : mSeekTimeUs(seekTimeUs) { 74 } 75 76 virtual void execute(NuPlayer *player) { 77 player->performSeek(mSeekTimeUs); 78 } 79 80private: 81 int64_t mSeekTimeUs; 82 83 DISALLOW_EVIL_CONSTRUCTORS(SeekAction); 84}; 85 86struct NuPlayer::ResumeDecoderAction : public Action { 87 ResumeDecoderAction(bool needNotify) 88 : mNeedNotify(needNotify) { 89 } 90 91 virtual void execute(NuPlayer *player) { 92 player->performResumeDecoders(mNeedNotify); 93 } 94 95private: 96 bool mNeedNotify; 97 98 DISALLOW_EVIL_CONSTRUCTORS(ResumeDecoderAction); 99}; 100 101struct NuPlayer::SetSurfaceAction : public Action { 102 SetSurfaceAction(const sp<Surface> &surface) 103 : mSurface(surface) { 104 } 105 106 virtual void execute(NuPlayer *player) { 107 player->performSetSurface(mSurface); 108 } 109 110private: 111 sp<Surface> mSurface; 112 113 DISALLOW_EVIL_CONSTRUCTORS(SetSurfaceAction); 114}; 115 116struct NuPlayer::FlushDecoderAction : public Action { 117 FlushDecoderAction(FlushCommand audio, FlushCommand video) 118 : mAudio(audio), 119 mVideo(video) { 120 } 121 122 virtual void execute(NuPlayer *player) { 123 player->performDecoderFlush(mAudio, mVideo); 124 } 125 126private: 127 FlushCommand mAudio; 128 FlushCommand mVideo; 129 130 DISALLOW_EVIL_CONSTRUCTORS(FlushDecoderAction); 131}; 132 133struct NuPlayer::PostMessageAction : public Action { 134 PostMessageAction(const sp<AMessage> &msg) 135 : mMessage(msg) { 136 } 137 138 virtual void execute(NuPlayer *) { 139 mMessage->post(); 140 } 141 142private: 143 sp<AMessage> mMessage; 144 145 DISALLOW_EVIL_CONSTRUCTORS(PostMessageAction); 146}; 147 148// Use this if there's no state necessary to save in order to execute 149// the action. 150struct NuPlayer::SimpleAction : public Action { 151 typedef void (NuPlayer::*ActionFunc)(); 152 153 SimpleAction(ActionFunc func) 154 : mFunc(func) { 155 } 156 157 virtual void execute(NuPlayer *player) { 158 (player->*mFunc)(); 159 } 160 161private: 162 ActionFunc mFunc; 163 164 DISALLOW_EVIL_CONSTRUCTORS(SimpleAction); 165}; 166 167//////////////////////////////////////////////////////////////////////////////// 168 169NuPlayer::NuPlayer(pid_t pid) 170 : mUIDValid(false), 171 mPID(pid), 172 mSourceFlags(0), 173 mOffloadAudio(false), 174 mAudioDecoderGeneration(0), 175 mVideoDecoderGeneration(0), 176 mRendererGeneration(0), 177 mPreviousSeekTimeUs(0), 178 mAudioEOS(false), 179 mVideoEOS(false), 180 mScanSourcesPending(false), 181 mScanSourcesGeneration(0), 182 mPollDurationGeneration(0), 183 mTimedTextGeneration(0), 184 mFlushingAudio(NONE), 185 mFlushingVideo(NONE), 186 mResumePending(false), 187 mVideoScalingMode(NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW), 188 mPlaybackSettings(AUDIO_PLAYBACK_RATE_DEFAULT), 189 mVideoFpsHint(-1.f), 190 mStarted(false), 191 mSourceStarted(false), 192 mPaused(false), 193 mPausedByClient(false), 194 mPausedForBuffering(false) { 195 clearFlushComplete(); 196} 197 198NuPlayer::~NuPlayer() { 199} 200 201void NuPlayer::setUID(uid_t uid) { 202 mUIDValid = true; 203 mUID = uid; 204} 205 206void NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) { 207 mDriver = driver; 208} 209 210void NuPlayer::setDataSourceAsync(const sp<IStreamSource> &source) { 211 sp<AMessage> msg = new AMessage(kWhatSetDataSource, this); 212 213 sp<AMessage> notify = new AMessage(kWhatSourceNotify, this); 214 215 msg->setObject("source", new StreamingSource(notify, source)); 216 msg->post(); 217} 218 219static bool IsHTTPLiveURL(const char *url) { 220 if (!strncasecmp("http://", url, 7) 221 || !strncasecmp("https://", url, 8) 222 || !strncasecmp("file://", url, 7)) { 223 size_t len = strlen(url); 224 if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) { 225 return true; 226 } 227 228 if (strstr(url,"m3u8")) { 229 return true; 230 } 231 } 232 233 return false; 234} 235 236void NuPlayer::setDataSourceAsync( 237 const sp<IMediaHTTPService> &httpService, 238 const char *url, 239 const KeyedVector<String8, String8> *headers) { 240 241 sp<AMessage> msg = new AMessage(kWhatSetDataSource, this); 242 size_t len = strlen(url); 243 244 sp<AMessage> notify = new AMessage(kWhatSourceNotify, this); 245 246 sp<Source> source; 247 if (IsHTTPLiveURL(url)) { 248 source = new HTTPLiveSource(notify, httpService, url, headers); 249 } else if (!strncasecmp(url, "rtsp://", 7)) { 250 source = new RTSPSource( 251 notify, httpService, url, headers, mUIDValid, mUID); 252 } else if ((!strncasecmp(url, "http://", 7) 253 || !strncasecmp(url, "https://", 8)) 254 && ((len >= 4 && !strcasecmp(".sdp", &url[len - 4])) 255 || strstr(url, ".sdp?"))) { 256 source = new RTSPSource( 257 notify, httpService, url, headers, mUIDValid, mUID, true); 258 } else { 259 sp<GenericSource> genericSource = 260 new GenericSource(notify, mUIDValid, mUID); 261 // Don't set FLAG_SECURE on mSourceFlags here for widevine. 262 // The correct flags will be updated in Source::kWhatFlagsChanged 263 // handler when GenericSource is prepared. 264 265 status_t err = genericSource->setDataSource(httpService, url, headers); 266 267 if (err == OK) { 268 source = genericSource; 269 } else { 270 ALOGE("Failed to set data source!"); 271 } 272 } 273 msg->setObject("source", source); 274 msg->post(); 275} 276 277void NuPlayer::setDataSourceAsync(int fd, int64_t offset, int64_t length) { 278 sp<AMessage> msg = new AMessage(kWhatSetDataSource, this); 279 280 sp<AMessage> notify = new AMessage(kWhatSourceNotify, this); 281 282 sp<GenericSource> source = 283 new GenericSource(notify, mUIDValid, mUID); 284 285 status_t err = source->setDataSource(fd, offset, length); 286 287 if (err != OK) { 288 ALOGE("Failed to set data source!"); 289 source = NULL; 290 } 291 292 msg->setObject("source", source); 293 msg->post(); 294} 295 296void NuPlayer::setDataSourceAsync(const sp<DataSource> &dataSource) { 297 sp<AMessage> msg = new AMessage(kWhatSetDataSource, this); 298 sp<AMessage> notify = new AMessage(kWhatSourceNotify, this); 299 300 sp<GenericSource> source = new GenericSource(notify, mUIDValid, mUID); 301 status_t err = source->setDataSource(dataSource); 302 303 if (err != OK) { 304 ALOGE("Failed to set data source!"); 305 source = NULL; 306 } 307 308 msg->setObject("source", source); 309 msg->post(); 310} 311 312void NuPlayer::prepareAsync() { 313 (new AMessage(kWhatPrepare, this))->post(); 314} 315 316void NuPlayer::setVideoSurfaceTextureAsync( 317 const sp<IGraphicBufferProducer> &bufferProducer) { 318 sp<AMessage> msg = new AMessage(kWhatSetVideoSurface, this); 319 320 if (bufferProducer == NULL) { 321 msg->setObject("surface", NULL); 322 } else { 323 msg->setObject("surface", new Surface(bufferProducer, true /* controlledByApp */)); 324 } 325 326 msg->post(); 327} 328 329void NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) { 330 sp<AMessage> msg = new AMessage(kWhatSetAudioSink, this); 331 msg->setObject("sink", sink); 332 msg->post(); 333} 334 335void NuPlayer::start() { 336 (new AMessage(kWhatStart, this))->post(); 337} 338 339status_t NuPlayer::setPlaybackSettings(const AudioPlaybackRate &rate) { 340 // do some cursory validation of the settings here. audio modes are 341 // only validated when set on the audiosink. 342 if ((rate.mSpeed != 0.f && rate.mSpeed < AUDIO_TIMESTRETCH_SPEED_MIN) 343 || rate.mSpeed > AUDIO_TIMESTRETCH_SPEED_MAX 344 || rate.mPitch < AUDIO_TIMESTRETCH_SPEED_MIN 345 || rate.mPitch > AUDIO_TIMESTRETCH_SPEED_MAX) { 346 return BAD_VALUE; 347 } 348 sp<AMessage> msg = new AMessage(kWhatConfigPlayback, this); 349 writeToAMessage(msg, rate); 350 sp<AMessage> response; 351 status_t err = msg->postAndAwaitResponse(&response); 352 if (err == OK && response != NULL) { 353 CHECK(response->findInt32("err", &err)); 354 } 355 return err; 356} 357 358status_t NuPlayer::getPlaybackSettings(AudioPlaybackRate *rate /* nonnull */) { 359 sp<AMessage> msg = new AMessage(kWhatGetPlaybackSettings, this); 360 sp<AMessage> response; 361 status_t err = msg->postAndAwaitResponse(&response); 362 if (err == OK && response != NULL) { 363 CHECK(response->findInt32("err", &err)); 364 if (err == OK) { 365 readFromAMessage(response, rate); 366 } 367 } 368 return err; 369} 370 371status_t NuPlayer::setSyncSettings(const AVSyncSettings &sync, float videoFpsHint) { 372 sp<AMessage> msg = new AMessage(kWhatConfigSync, this); 373 writeToAMessage(msg, sync, videoFpsHint); 374 sp<AMessage> response; 375 status_t err = msg->postAndAwaitResponse(&response); 376 if (err == OK && response != NULL) { 377 CHECK(response->findInt32("err", &err)); 378 } 379 return err; 380} 381 382status_t NuPlayer::getSyncSettings( 383 AVSyncSettings *sync /* nonnull */, float *videoFps /* nonnull */) { 384 sp<AMessage> msg = new AMessage(kWhatGetSyncSettings, this); 385 sp<AMessage> response; 386 status_t err = msg->postAndAwaitResponse(&response); 387 if (err == OK && response != NULL) { 388 CHECK(response->findInt32("err", &err)); 389 if (err == OK) { 390 readFromAMessage(response, sync, videoFps); 391 } 392 } 393 return err; 394} 395 396void NuPlayer::pause() { 397 (new AMessage(kWhatPause, this))->post(); 398} 399 400void NuPlayer::resetAsync() { 401 if (mSource != NULL) { 402 // During a reset, the data source might be unresponsive already, we need to 403 // disconnect explicitly so that reads exit promptly. 404 // We can't queue the disconnect request to the looper, as it might be 405 // queued behind a stuck read and never gets processed. 406 // Doing a disconnect outside the looper to allows the pending reads to exit 407 // (either successfully or with error). 408 mSource->disconnect(); 409 } 410 411 (new AMessage(kWhatReset, this))->post(); 412} 413 414void NuPlayer::seekToAsync(int64_t seekTimeUs, bool needNotify) { 415 sp<AMessage> msg = new AMessage(kWhatSeek, this); 416 msg->setInt64("seekTimeUs", seekTimeUs); 417 msg->setInt32("needNotify", needNotify); 418 msg->post(); 419} 420 421 422void NuPlayer::writeTrackInfo( 423 Parcel* reply, const sp<AMessage> format) const { 424 if (format == NULL) { 425 ALOGE("NULL format"); 426 return; 427 } 428 int32_t trackType; 429 if (format->findInt32("type", &trackType) != OK) { 430 ALOGE("no track type"); 431 return; 432 } 433 434 AString mime; 435 if (!format->findString("mime", &mime)) { 436 // Java MediaPlayer only uses mimetype for subtitle and timedtext tracks. 437 // If we can't find the mimetype here it means that we wouldn't be needing 438 // the mimetype on the Java end. We still write a placeholder mime to keep the 439 // (de)serialization logic simple. 440 if (trackType == MEDIA_TRACK_TYPE_AUDIO) { 441 mime = "audio/"; 442 } else if (trackType == MEDIA_TRACK_TYPE_VIDEO) { 443 mime = "video/"; 444 } else { 445 ALOGE("unknown track type: %d", trackType); 446 return; 447 } 448 } 449 450 AString lang; 451 if (format->findString("language", &lang)) { 452 ALOGE("no language"); 453 return; 454 } 455 456 reply->writeInt32(2); // write something non-zero 457 reply->writeInt32(trackType); 458 reply->writeString16(String16(mime.c_str())); 459 reply->writeString16(String16(lang.c_str())); 460 461 if (trackType == MEDIA_TRACK_TYPE_SUBTITLE) { 462 int32_t isAuto, isDefault, isForced; 463 CHECK(format->findInt32("auto", &isAuto)); 464 CHECK(format->findInt32("default", &isDefault)); 465 CHECK(format->findInt32("forced", &isForced)); 466 467 reply->writeInt32(isAuto); 468 reply->writeInt32(isDefault); 469 reply->writeInt32(isForced); 470 } 471} 472 473void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { 474 switch (msg->what()) { 475 case kWhatSetDataSource: 476 { 477 ALOGV("kWhatSetDataSource"); 478 479 CHECK(mSource == NULL); 480 481 status_t err = OK; 482 sp<RefBase> obj; 483 CHECK(msg->findObject("source", &obj)); 484 if (obj != NULL) { 485 mSource = static_cast<Source *>(obj.get()); 486 } else { 487 err = UNKNOWN_ERROR; 488 } 489 490 CHECK(mDriver != NULL); 491 sp<NuPlayerDriver> driver = mDriver.promote(); 492 if (driver != NULL) { 493 driver->notifySetDataSourceCompleted(err); 494 } 495 break; 496 } 497 498 case kWhatPrepare: 499 { 500 mSource->prepareAsync(); 501 break; 502 } 503 504 case kWhatGetTrackInfo: 505 { 506 sp<AReplyToken> replyID; 507 CHECK(msg->senderAwaitsResponse(&replyID)); 508 509 Parcel* reply; 510 CHECK(msg->findPointer("reply", (void**)&reply)); 511 512 size_t inbandTracks = 0; 513 if (mSource != NULL) { 514 inbandTracks = mSource->getTrackCount(); 515 } 516 517 size_t ccTracks = 0; 518 if (mCCDecoder != NULL) { 519 ccTracks = mCCDecoder->getTrackCount(); 520 } 521 522 // total track count 523 reply->writeInt32(inbandTracks + ccTracks); 524 525 // write inband tracks 526 for (size_t i = 0; i < inbandTracks; ++i) { 527 writeTrackInfo(reply, mSource->getTrackInfo(i)); 528 } 529 530 // write CC track 531 for (size_t i = 0; i < ccTracks; ++i) { 532 writeTrackInfo(reply, mCCDecoder->getTrackInfo(i)); 533 } 534 535 sp<AMessage> response = new AMessage; 536 response->postReply(replyID); 537 break; 538 } 539 540 case kWhatGetSelectedTrack: 541 { 542 status_t err = INVALID_OPERATION; 543 if (mSource != NULL) { 544 err = OK; 545 546 int32_t type32; 547 CHECK(msg->findInt32("type", (int32_t*)&type32)); 548 media_track_type type = (media_track_type)type32; 549 ssize_t selectedTrack = mSource->getSelectedTrack(type); 550 551 Parcel* reply; 552 CHECK(msg->findPointer("reply", (void**)&reply)); 553 reply->writeInt32(selectedTrack); 554 } 555 556 sp<AMessage> response = new AMessage; 557 response->setInt32("err", err); 558 559 sp<AReplyToken> replyID; 560 CHECK(msg->senderAwaitsResponse(&replyID)); 561 response->postReply(replyID); 562 break; 563 } 564 565 case kWhatSelectTrack: 566 { 567 sp<AReplyToken> replyID; 568 CHECK(msg->senderAwaitsResponse(&replyID)); 569 570 size_t trackIndex; 571 int32_t select; 572 int64_t timeUs; 573 CHECK(msg->findSize("trackIndex", &trackIndex)); 574 CHECK(msg->findInt32("select", &select)); 575 CHECK(msg->findInt64("timeUs", &timeUs)); 576 577 status_t err = INVALID_OPERATION; 578 579 size_t inbandTracks = 0; 580 if (mSource != NULL) { 581 inbandTracks = mSource->getTrackCount(); 582 } 583 size_t ccTracks = 0; 584 if (mCCDecoder != NULL) { 585 ccTracks = mCCDecoder->getTrackCount(); 586 } 587 588 if (trackIndex < inbandTracks) { 589 err = mSource->selectTrack(trackIndex, select, timeUs); 590 591 if (!select && err == OK) { 592 int32_t type; 593 sp<AMessage> info = mSource->getTrackInfo(trackIndex); 594 if (info != NULL 595 && info->findInt32("type", &type) 596 && type == MEDIA_TRACK_TYPE_TIMEDTEXT) { 597 ++mTimedTextGeneration; 598 } 599 } 600 } else { 601 trackIndex -= inbandTracks; 602 603 if (trackIndex < ccTracks) { 604 err = mCCDecoder->selectTrack(trackIndex, select); 605 } 606 } 607 608 sp<AMessage> response = new AMessage; 609 response->setInt32("err", err); 610 611 response->postReply(replyID); 612 break; 613 } 614 615 case kWhatPollDuration: 616 { 617 int32_t generation; 618 CHECK(msg->findInt32("generation", &generation)); 619 620 if (generation != mPollDurationGeneration) { 621 // stale 622 break; 623 } 624 625 int64_t durationUs; 626 if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 627 sp<NuPlayerDriver> driver = mDriver.promote(); 628 if (driver != NULL) { 629 driver->notifyDuration(durationUs); 630 } 631 } 632 633 msg->post(1000000ll); // poll again in a second. 634 break; 635 } 636 637 case kWhatSetVideoSurface: 638 { 639 640 sp<RefBase> obj; 641 CHECK(msg->findObject("surface", &obj)); 642 sp<Surface> surface = static_cast<Surface *>(obj.get()); 643 644 ALOGD("onSetVideoSurface(%p, %s video decoder)", 645 surface.get(), 646 (mSource != NULL && mStarted && mSource->getFormat(false /* audio */) != NULL 647 && mVideoDecoder != NULL) ? "have" : "no"); 648 649 // Need to check mStarted before calling mSource->getFormat because NuPlayer might 650 // be in preparing state and it could take long time. 651 // When mStarted is true, mSource must have been set. 652 if (mSource == NULL || !mStarted || mSource->getFormat(false /* audio */) == NULL 653 // NOTE: mVideoDecoder's mSurface is always non-null 654 || (mVideoDecoder != NULL && mVideoDecoder->setVideoSurface(surface) == OK)) { 655 performSetSurface(surface); 656 break; 657 } 658 659 mDeferredActions.push_back( 660 new FlushDecoderAction(FLUSH_CMD_FLUSH /* audio */, 661 FLUSH_CMD_SHUTDOWN /* video */)); 662 663 mDeferredActions.push_back(new SetSurfaceAction(surface)); 664 665 if (obj != NULL || mAudioDecoder != NULL) { 666 if (mStarted) { 667 // Issue a seek to refresh the video screen only if started otherwise 668 // the extractor may not yet be started and will assert. 669 // If the video decoder is not set (perhaps audio only in this case) 670 // do not perform a seek as it is not needed. 671 int64_t currentPositionUs = 0; 672 if (getCurrentPosition(¤tPositionUs) == OK) { 673 mDeferredActions.push_back( 674 new SeekAction(currentPositionUs)); 675 } 676 } 677 678 // If there is a new surface texture, instantiate decoders 679 // again if possible. 680 mDeferredActions.push_back( 681 new SimpleAction(&NuPlayer::performScanSources)); 682 } 683 684 // After a flush without shutdown, decoder is paused. 685 // Don't resume it until source seek is done, otherwise it could 686 // start pulling stale data too soon. 687 mDeferredActions.push_back( 688 new ResumeDecoderAction(false /* needNotify */)); 689 690 processDeferredActions(); 691 break; 692 } 693 694 case kWhatSetAudioSink: 695 { 696 ALOGV("kWhatSetAudioSink"); 697 698 sp<RefBase> obj; 699 CHECK(msg->findObject("sink", &obj)); 700 701 mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get()); 702 break; 703 } 704 705 case kWhatStart: 706 { 707 ALOGV("kWhatStart"); 708 if (mStarted) { 709 // do not resume yet if the source is still buffering 710 if (!mPausedForBuffering) { 711 onResume(); 712 } 713 } else { 714 onStart(); 715 } 716 mPausedByClient = false; 717 break; 718 } 719 720 case kWhatConfigPlayback: 721 { 722 sp<AReplyToken> replyID; 723 CHECK(msg->senderAwaitsResponse(&replyID)); 724 AudioPlaybackRate rate /* sanitized */; 725 readFromAMessage(msg, &rate); 726 status_t err = OK; 727 if (mRenderer != NULL) { 728 err = mRenderer->setPlaybackSettings(rate); 729 } 730 if (err == OK) { 731 if (rate.mSpeed == 0.f) { 732 onPause(); 733 // save all other settings (using non-paused speed) 734 // so we can restore them on start 735 AudioPlaybackRate newRate = rate; 736 newRate.mSpeed = mPlaybackSettings.mSpeed; 737 mPlaybackSettings = newRate; 738 } else { /* rate.mSpeed != 0.f */ 739 onResume(); 740 mPlaybackSettings = rate; 741 } 742 } 743 744 if (mVideoDecoder != NULL) { 745 float rate = getFrameRate(); 746 if (rate > 0) { 747 sp<AMessage> params = new AMessage(); 748 params->setFloat("operating-rate", rate * mPlaybackSettings.mSpeed); 749 mVideoDecoder->setParameters(params); 750 } 751 } 752 753 sp<AMessage> response = new AMessage; 754 response->setInt32("err", err); 755 response->postReply(replyID); 756 break; 757 } 758 759 case kWhatGetPlaybackSettings: 760 { 761 sp<AReplyToken> replyID; 762 CHECK(msg->senderAwaitsResponse(&replyID)); 763 AudioPlaybackRate rate = mPlaybackSettings; 764 status_t err = OK; 765 if (mRenderer != NULL) { 766 err = mRenderer->getPlaybackSettings(&rate); 767 } 768 if (err == OK) { 769 // get playback settings used by renderer, as it may be 770 // slightly off due to audiosink not taking small changes. 771 mPlaybackSettings = rate; 772 if (mPaused) { 773 rate.mSpeed = 0.f; 774 } 775 } 776 sp<AMessage> response = new AMessage; 777 if (err == OK) { 778 writeToAMessage(response, rate); 779 } 780 response->setInt32("err", err); 781 response->postReply(replyID); 782 break; 783 } 784 785 case kWhatConfigSync: 786 { 787 sp<AReplyToken> replyID; 788 CHECK(msg->senderAwaitsResponse(&replyID)); 789 790 ALOGV("kWhatConfigSync"); 791 AVSyncSettings sync; 792 float videoFpsHint; 793 readFromAMessage(msg, &sync, &videoFpsHint); 794 status_t err = OK; 795 if (mRenderer != NULL) { 796 err = mRenderer->setSyncSettings(sync, videoFpsHint); 797 } 798 if (err == OK) { 799 mSyncSettings = sync; 800 mVideoFpsHint = videoFpsHint; 801 } 802 sp<AMessage> response = new AMessage; 803 response->setInt32("err", err); 804 response->postReply(replyID); 805 break; 806 } 807 808 case kWhatGetSyncSettings: 809 { 810 sp<AReplyToken> replyID; 811 CHECK(msg->senderAwaitsResponse(&replyID)); 812 AVSyncSettings sync = mSyncSettings; 813 float videoFps = mVideoFpsHint; 814 status_t err = OK; 815 if (mRenderer != NULL) { 816 err = mRenderer->getSyncSettings(&sync, &videoFps); 817 if (err == OK) { 818 mSyncSettings = sync; 819 mVideoFpsHint = videoFps; 820 } 821 } 822 sp<AMessage> response = new AMessage; 823 if (err == OK) { 824 writeToAMessage(response, sync, videoFps); 825 } 826 response->setInt32("err", err); 827 response->postReply(replyID); 828 break; 829 } 830 831 case kWhatScanSources: 832 { 833 int32_t generation; 834 CHECK(msg->findInt32("generation", &generation)); 835 if (generation != mScanSourcesGeneration) { 836 // Drop obsolete msg. 837 break; 838 } 839 840 mScanSourcesPending = false; 841 842 ALOGV("scanning sources haveAudio=%d, haveVideo=%d", 843 mAudioDecoder != NULL, mVideoDecoder != NULL); 844 845 bool mHadAnySourcesBefore = 846 (mAudioDecoder != NULL) || (mVideoDecoder != NULL); 847 848 // initialize video before audio because successful initialization of 849 // video may change deep buffer mode of audio. 850 if (mSurface != NULL) { 851 instantiateDecoder(false, &mVideoDecoder); 852 } 853 854 // Don't try to re-open audio sink if there's an existing decoder. 855 if (mAudioSink != NULL && mAudioDecoder == NULL) { 856 instantiateDecoder(true, &mAudioDecoder); 857 } 858 859 if (!mHadAnySourcesBefore 860 && (mAudioDecoder != NULL || mVideoDecoder != NULL)) { 861 // This is the first time we've found anything playable. 862 863 if (mSourceFlags & Source::FLAG_DYNAMIC_DURATION) { 864 schedulePollDuration(); 865 } 866 } 867 868 status_t err; 869 if ((err = mSource->feedMoreTSData()) != OK) { 870 if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 871 // We're not currently decoding anything (no audio or 872 // video tracks found) and we just ran out of input data. 873 874 if (err == ERROR_END_OF_STREAM) { 875 notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 876 } else { 877 notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 878 } 879 } 880 break; 881 } 882 883 if ((mAudioDecoder == NULL && mAudioSink != NULL) 884 || (mVideoDecoder == NULL && mSurface != NULL)) { 885 msg->post(100000ll); 886 mScanSourcesPending = true; 887 } 888 break; 889 } 890 891 case kWhatVideoNotify: 892 case kWhatAudioNotify: 893 { 894 bool audio = msg->what() == kWhatAudioNotify; 895 896 int32_t currentDecoderGeneration = 897 (audio? mAudioDecoderGeneration : mVideoDecoderGeneration); 898 int32_t requesterGeneration = currentDecoderGeneration - 1; 899 CHECK(msg->findInt32("generation", &requesterGeneration)); 900 901 if (requesterGeneration != currentDecoderGeneration) { 902 ALOGV("got message from old %s decoder, generation(%d:%d)", 903 audio ? "audio" : "video", requesterGeneration, 904 currentDecoderGeneration); 905 sp<AMessage> reply; 906 if (!(msg->findMessage("reply", &reply))) { 907 return; 908 } 909 910 reply->setInt32("err", INFO_DISCONTINUITY); 911 reply->post(); 912 return; 913 } 914 915 int32_t what; 916 CHECK(msg->findInt32("what", &what)); 917 918 if (what == DecoderBase::kWhatInputDiscontinuity) { 919 int32_t formatChange; 920 CHECK(msg->findInt32("formatChange", &formatChange)); 921 922 ALOGV("%s discontinuity: formatChange %d", 923 audio ? "audio" : "video", formatChange); 924 925 if (formatChange) { 926 mDeferredActions.push_back( 927 new FlushDecoderAction( 928 audio ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE, 929 audio ? FLUSH_CMD_NONE : FLUSH_CMD_SHUTDOWN)); 930 } 931 932 mDeferredActions.push_back( 933 new SimpleAction( 934 &NuPlayer::performScanSources)); 935 936 processDeferredActions(); 937 } else if (what == DecoderBase::kWhatEOS) { 938 int32_t err; 939 CHECK(msg->findInt32("err", &err)); 940 941 if (err == ERROR_END_OF_STREAM) { 942 ALOGV("got %s decoder EOS", audio ? "audio" : "video"); 943 } else { 944 ALOGV("got %s decoder EOS w/ error %d", 945 audio ? "audio" : "video", 946 err); 947 } 948 949 mRenderer->queueEOS(audio, err); 950 } else if (what == DecoderBase::kWhatFlushCompleted) { 951 ALOGV("decoder %s flush completed", audio ? "audio" : "video"); 952 953 handleFlushComplete(audio, true /* isDecoder */); 954 finishFlushIfPossible(); 955 } else if (what == DecoderBase::kWhatVideoSizeChanged) { 956 sp<AMessage> format; 957 CHECK(msg->findMessage("format", &format)); 958 959 sp<AMessage> inputFormat = 960 mSource->getFormat(false /* audio */); 961 962 updateVideoSize(inputFormat, format); 963 } else if (what == DecoderBase::kWhatShutdownCompleted) { 964 ALOGV("%s shutdown completed", audio ? "audio" : "video"); 965 if (audio) { 966 mAudioDecoder.clear(); 967 ++mAudioDecoderGeneration; 968 969 CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER); 970 mFlushingAudio = SHUT_DOWN; 971 } else { 972 mVideoDecoder.clear(); 973 ++mVideoDecoderGeneration; 974 975 CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER); 976 mFlushingVideo = SHUT_DOWN; 977 } 978 979 finishFlushIfPossible(); 980 } else if (what == DecoderBase::kWhatResumeCompleted) { 981 finishResume(); 982 } else if (what == DecoderBase::kWhatError) { 983 status_t err; 984 if (!msg->findInt32("err", &err) || err == OK) { 985 err = UNKNOWN_ERROR; 986 } 987 988 // Decoder errors can be due to Source (e.g. from streaming), 989 // or from decoding corrupted bitstreams, or from other decoder 990 // MediaCodec operations (e.g. from an ongoing reset or seek). 991 // They may also be due to openAudioSink failure at 992 // decoder start or after a format change. 993 // 994 // We try to gracefully shut down the affected decoder if possible, 995 // rather than trying to force the shutdown with something 996 // similar to performReset(). This method can lead to a hang 997 // if MediaCodec functions block after an error, but they should 998 // typically return INVALID_OPERATION instead of blocking. 999 1000 FlushStatus *flushing = audio ? &mFlushingAudio : &mFlushingVideo; 1001 ALOGE("received error(%#x) from %s decoder, flushing(%d), now shutting down", 1002 err, audio ? "audio" : "video", *flushing); 1003 1004 switch (*flushing) { 1005 case NONE: 1006 mDeferredActions.push_back( 1007 new FlushDecoderAction( 1008 audio ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE, 1009 audio ? FLUSH_CMD_NONE : FLUSH_CMD_SHUTDOWN)); 1010 processDeferredActions(); 1011 break; 1012 case FLUSHING_DECODER: 1013 *flushing = FLUSHING_DECODER_SHUTDOWN; // initiate shutdown after flush. 1014 break; // Wait for flush to complete. 1015 case FLUSHING_DECODER_SHUTDOWN: 1016 break; // Wait for flush to complete. 1017 case SHUTTING_DOWN_DECODER: 1018 break; // Wait for shutdown to complete. 1019 case FLUSHED: 1020 // Widevine source reads must stop before releasing the video decoder. 1021 if (!audio && mSource != NULL && mSourceFlags & Source::FLAG_SECURE) { 1022 mSource->stop(); 1023 mSourceStarted = false; 1024 } 1025 getDecoder(audio)->initiateShutdown(); // In the middle of a seek. 1026 *flushing = SHUTTING_DOWN_DECODER; // Shut down. 1027 break; 1028 case SHUT_DOWN: 1029 finishFlushIfPossible(); // Should not occur. 1030 break; // Finish anyways. 1031 } 1032 notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 1033 } else { 1034 ALOGV("Unhandled decoder notification %d '%c%c%c%c'.", 1035 what, 1036 what >> 24, 1037 (what >> 16) & 0xff, 1038 (what >> 8) & 0xff, 1039 what & 0xff); 1040 } 1041 1042 break; 1043 } 1044 1045 case kWhatRendererNotify: 1046 { 1047 int32_t requesterGeneration = mRendererGeneration - 1; 1048 CHECK(msg->findInt32("generation", &requesterGeneration)); 1049 if (requesterGeneration != mRendererGeneration) { 1050 ALOGV("got message from old renderer, generation(%d:%d)", 1051 requesterGeneration, mRendererGeneration); 1052 return; 1053 } 1054 1055 int32_t what; 1056 CHECK(msg->findInt32("what", &what)); 1057 1058 if (what == Renderer::kWhatEOS) { 1059 int32_t audio; 1060 CHECK(msg->findInt32("audio", &audio)); 1061 1062 int32_t finalResult; 1063 CHECK(msg->findInt32("finalResult", &finalResult)); 1064 1065 if (audio) { 1066 mAudioEOS = true; 1067 } else { 1068 mVideoEOS = true; 1069 } 1070 1071 if (finalResult == ERROR_END_OF_STREAM) { 1072 ALOGV("reached %s EOS", audio ? "audio" : "video"); 1073 } else { 1074 ALOGE("%s track encountered an error (%d)", 1075 audio ? "audio" : "video", finalResult); 1076 1077 notifyListener( 1078 MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult); 1079 } 1080 1081 if ((mAudioEOS || mAudioDecoder == NULL) 1082 && (mVideoEOS || mVideoDecoder == NULL)) { 1083 notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 1084 } 1085 } else if (what == Renderer::kWhatFlushComplete) { 1086 int32_t audio; 1087 CHECK(msg->findInt32("audio", &audio)); 1088 1089 ALOGV("renderer %s flush completed.", audio ? "audio" : "video"); 1090 if (audio && (mFlushingAudio == NONE || mFlushingAudio == FLUSHED 1091 || mFlushingAudio == SHUT_DOWN)) { 1092 // Flush has been handled by tear down. 1093 break; 1094 } 1095 handleFlushComplete(audio, false /* isDecoder */); 1096 finishFlushIfPossible(); 1097 } else if (what == Renderer::kWhatVideoRenderingStart) { 1098 notifyListener(MEDIA_INFO, MEDIA_INFO_RENDERING_START, 0); 1099 } else if (what == Renderer::kWhatMediaRenderingStart) { 1100 ALOGV("media rendering started"); 1101 notifyListener(MEDIA_STARTED, 0, 0); 1102 } else if (what == Renderer::kWhatAudioTearDown) { 1103 int32_t reason; 1104 CHECK(msg->findInt32("reason", &reason)); 1105 ALOGV("Tear down audio with reason %d.", reason); 1106 mAudioDecoder.clear(); 1107 ++mAudioDecoderGeneration; 1108 bool needsToCreateAudioDecoder = true; 1109 if (mFlushingAudio == FLUSHING_DECODER) { 1110 mFlushComplete[1 /* audio */][1 /* isDecoder */] = true; 1111 mFlushingAudio = FLUSHED; 1112 finishFlushIfPossible(); 1113 } else if (mFlushingAudio == FLUSHING_DECODER_SHUTDOWN 1114 || mFlushingAudio == SHUTTING_DOWN_DECODER) { 1115 mFlushComplete[1 /* audio */][1 /* isDecoder */] = true; 1116 mFlushingAudio = SHUT_DOWN; 1117 finishFlushIfPossible(); 1118 needsToCreateAudioDecoder = false; 1119 } 1120 if (mRenderer == NULL) { 1121 break; 1122 } 1123 closeAudioSink(); 1124 mRenderer->flush( 1125 true /* audio */, false /* notifyComplete */); 1126 if (mVideoDecoder != NULL) { 1127 mRenderer->flush( 1128 false /* audio */, false /* notifyComplete */); 1129 } 1130 1131 int64_t positionUs; 1132 if (!msg->findInt64("positionUs", &positionUs)) { 1133 positionUs = mPreviousSeekTimeUs; 1134 } 1135 performSeek(positionUs); 1136 1137 if (reason == Renderer::kDueToError && needsToCreateAudioDecoder) { 1138 instantiateDecoder(true /* audio */, &mAudioDecoder); 1139 } 1140 } 1141 break; 1142 } 1143 1144 case kWhatMoreDataQueued: 1145 { 1146 break; 1147 } 1148 1149 case kWhatReset: 1150 { 1151 ALOGV("kWhatReset"); 1152 1153 mDeferredActions.push_back( 1154 new FlushDecoderAction( 1155 FLUSH_CMD_SHUTDOWN /* audio */, 1156 FLUSH_CMD_SHUTDOWN /* video */)); 1157 1158 mDeferredActions.push_back( 1159 new SimpleAction(&NuPlayer::performReset)); 1160 1161 processDeferredActions(); 1162 break; 1163 } 1164 1165 case kWhatSeek: 1166 { 1167 int64_t seekTimeUs; 1168 int32_t needNotify; 1169 CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 1170 CHECK(msg->findInt32("needNotify", &needNotify)); 1171 1172 ALOGV("kWhatSeek seekTimeUs=%lld us, needNotify=%d", 1173 (long long)seekTimeUs, needNotify); 1174 1175 if (!mStarted) { 1176 // Seek before the player is started. In order to preview video, 1177 // need to start the player and pause it. This branch is called 1178 // only once if needed. After the player is started, any seek 1179 // operation will go through normal path. 1180 // Audio-only cases are handled separately. 1181 onStart(seekTimeUs); 1182 if (mStarted) { 1183 onPause(); 1184 mPausedByClient = true; 1185 } 1186 if (needNotify) { 1187 notifyDriverSeekComplete(); 1188 } 1189 break; 1190 } 1191 1192 mDeferredActions.push_back( 1193 new FlushDecoderAction(FLUSH_CMD_FLUSH /* audio */, 1194 FLUSH_CMD_FLUSH /* video */)); 1195 1196 mDeferredActions.push_back( 1197 new SeekAction(seekTimeUs)); 1198 1199 // After a flush without shutdown, decoder is paused. 1200 // Don't resume it until source seek is done, otherwise it could 1201 // start pulling stale data too soon. 1202 mDeferredActions.push_back( 1203 new ResumeDecoderAction(needNotify)); 1204 1205 processDeferredActions(); 1206 break; 1207 } 1208 1209 case kWhatPause: 1210 { 1211 onPause(); 1212 mPausedByClient = true; 1213 break; 1214 } 1215 1216 case kWhatSourceNotify: 1217 { 1218 onSourceNotify(msg); 1219 break; 1220 } 1221 1222 case kWhatClosedCaptionNotify: 1223 { 1224 onClosedCaptionNotify(msg); 1225 break; 1226 } 1227 1228 default: 1229 TRESPASS(); 1230 break; 1231 } 1232} 1233 1234void NuPlayer::onResume() { 1235 if (!mPaused) { 1236 return; 1237 } 1238 mPaused = false; 1239 if (mSource != NULL) { 1240 mSource->resume(); 1241 } else { 1242 ALOGW("resume called when source is gone or not set"); 1243 } 1244 // |mAudioDecoder| may have been released due to the pause timeout, so re-create it if 1245 // needed. 1246 if (audioDecoderStillNeeded() && mAudioDecoder == NULL) { 1247 instantiateDecoder(true /* audio */, &mAudioDecoder); 1248 } 1249 if (mRenderer != NULL) { 1250 mRenderer->resume(); 1251 } else { 1252 ALOGW("resume called when renderer is gone or not set"); 1253 } 1254} 1255 1256status_t NuPlayer::onInstantiateSecureDecoders() { 1257 status_t err; 1258 if (!(mSourceFlags & Source::FLAG_SECURE)) { 1259 return BAD_TYPE; 1260 } 1261 1262 if (mRenderer != NULL) { 1263 ALOGE("renderer should not be set when instantiating secure decoders"); 1264 return UNKNOWN_ERROR; 1265 } 1266 1267 // TRICKY: We rely on mRenderer being null, so that decoder does not start requesting 1268 // data on instantiation. 1269 if (mSurface != NULL) { 1270 err = instantiateDecoder(false, &mVideoDecoder); 1271 if (err != OK) { 1272 return err; 1273 } 1274 } 1275 1276 if (mAudioSink != NULL) { 1277 err = instantiateDecoder(true, &mAudioDecoder); 1278 if (err != OK) { 1279 return err; 1280 } 1281 } 1282 return OK; 1283} 1284 1285void NuPlayer::onStart(int64_t startPositionUs) { 1286 if (!mSourceStarted) { 1287 mSourceStarted = true; 1288 mSource->start(); 1289 } 1290 if (startPositionUs > 0) { 1291 performSeek(startPositionUs); 1292 if (mSource->getFormat(false /* audio */) == NULL) { 1293 return; 1294 } 1295 } 1296 1297 mOffloadAudio = false; 1298 mAudioEOS = false; 1299 mVideoEOS = false; 1300 mStarted = true; 1301 1302 uint32_t flags = 0; 1303 1304 if (mSource->isRealTime()) { 1305 flags |= Renderer::FLAG_REAL_TIME; 1306 } 1307 1308 sp<MetaData> audioMeta = mSource->getFormatMeta(true /* audio */); 1309 audio_stream_type_t streamType = AUDIO_STREAM_MUSIC; 1310 if (mAudioSink != NULL) { 1311 streamType = mAudioSink->getAudioStreamType(); 1312 } 1313 1314 sp<AMessage> videoFormat = mSource->getFormat(false /* audio */); 1315 1316 mOffloadAudio = 1317 canOffloadStream(audioMeta, (videoFormat != NULL), mSource->isStreaming(), streamType); 1318 if (mOffloadAudio) { 1319 flags |= Renderer::FLAG_OFFLOAD_AUDIO; 1320 } 1321 1322 sp<AMessage> notify = new AMessage(kWhatRendererNotify, this); 1323 ++mRendererGeneration; 1324 notify->setInt32("generation", mRendererGeneration); 1325 mRenderer = new Renderer(mAudioSink, notify, flags); 1326 mRendererLooper = new ALooper; 1327 mRendererLooper->setName("NuPlayerRenderer"); 1328 mRendererLooper->start(false, false, ANDROID_PRIORITY_AUDIO); 1329 mRendererLooper->registerHandler(mRenderer); 1330 1331 status_t err = mRenderer->setPlaybackSettings(mPlaybackSettings); 1332 if (err != OK) { 1333 mSource->stop(); 1334 mSourceStarted = false; 1335 notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 1336 return; 1337 } 1338 1339 float rate = getFrameRate(); 1340 if (rate > 0) { 1341 mRenderer->setVideoFrameRate(rate); 1342 } 1343 1344 if (mVideoDecoder != NULL) { 1345 mVideoDecoder->setRenderer(mRenderer); 1346 } 1347 if (mAudioDecoder != NULL) { 1348 mAudioDecoder->setRenderer(mRenderer); 1349 } 1350 1351 postScanSources(); 1352} 1353 1354void NuPlayer::onPause() { 1355 if (mPaused) { 1356 return; 1357 } 1358 mPaused = true; 1359 if (mSource != NULL) { 1360 mSource->pause(); 1361 } else { 1362 ALOGW("pause called when source is gone or not set"); 1363 } 1364 if (mRenderer != NULL) { 1365 mRenderer->pause(); 1366 } else { 1367 ALOGW("pause called when renderer is gone or not set"); 1368 } 1369} 1370 1371bool NuPlayer::audioDecoderStillNeeded() { 1372 // Audio decoder is no longer needed if it's in shut/shutting down status. 1373 return ((mFlushingAudio != SHUT_DOWN) && (mFlushingAudio != SHUTTING_DOWN_DECODER)); 1374} 1375 1376void NuPlayer::handleFlushComplete(bool audio, bool isDecoder) { 1377 // We wait for both the decoder flush and the renderer flush to complete 1378 // before entering either the FLUSHED or the SHUTTING_DOWN_DECODER state. 1379 1380 mFlushComplete[audio][isDecoder] = true; 1381 if (!mFlushComplete[audio][!isDecoder]) { 1382 return; 1383 } 1384 1385 FlushStatus *state = audio ? &mFlushingAudio : &mFlushingVideo; 1386 switch (*state) { 1387 case FLUSHING_DECODER: 1388 { 1389 *state = FLUSHED; 1390 break; 1391 } 1392 1393 case FLUSHING_DECODER_SHUTDOWN: 1394 { 1395 *state = SHUTTING_DOWN_DECODER; 1396 1397 ALOGV("initiating %s decoder shutdown", audio ? "audio" : "video"); 1398 if (!audio) { 1399 // Widevine source reads must stop before releasing the video decoder. 1400 if (mSource != NULL && mSourceFlags & Source::FLAG_SECURE) { 1401 mSource->stop(); 1402 mSourceStarted = false; 1403 } 1404 } 1405 getDecoder(audio)->initiateShutdown(); 1406 break; 1407 } 1408 1409 default: 1410 // decoder flush completes only occur in a flushing state. 1411 LOG_ALWAYS_FATAL_IF(isDecoder, "decoder flush in invalid state %d", *state); 1412 break; 1413 } 1414} 1415 1416void NuPlayer::finishFlushIfPossible() { 1417 if (mFlushingAudio != NONE && mFlushingAudio != FLUSHED 1418 && mFlushingAudio != SHUT_DOWN) { 1419 return; 1420 } 1421 1422 if (mFlushingVideo != NONE && mFlushingVideo != FLUSHED 1423 && mFlushingVideo != SHUT_DOWN) { 1424 return; 1425 } 1426 1427 ALOGV("both audio and video are flushed now."); 1428 1429 mFlushingAudio = NONE; 1430 mFlushingVideo = NONE; 1431 1432 clearFlushComplete(); 1433 1434 processDeferredActions(); 1435} 1436 1437void NuPlayer::postScanSources() { 1438 if (mScanSourcesPending) { 1439 return; 1440 } 1441 1442 sp<AMessage> msg = new AMessage(kWhatScanSources, this); 1443 msg->setInt32("generation", mScanSourcesGeneration); 1444 msg->post(); 1445 1446 mScanSourcesPending = true; 1447} 1448 1449void NuPlayer::tryOpenAudioSinkForOffload(const sp<AMessage> &format, bool hasVideo) { 1450 // Note: This is called early in NuPlayer to determine whether offloading 1451 // is possible; otherwise the decoders call the renderer openAudioSink directly. 1452 1453 status_t err = mRenderer->openAudioSink( 1454 format, true /* offloadOnly */, hasVideo, AUDIO_OUTPUT_FLAG_NONE, &mOffloadAudio); 1455 if (err != OK) { 1456 // Any failure we turn off mOffloadAudio. 1457 mOffloadAudio = false; 1458 } else if (mOffloadAudio) { 1459 sp<MetaData> audioMeta = 1460 mSource->getFormatMeta(true /* audio */); 1461 sendMetaDataToHal(mAudioSink, audioMeta); 1462 } 1463} 1464 1465void NuPlayer::closeAudioSink() { 1466 mRenderer->closeAudioSink(); 1467} 1468 1469void NuPlayer::determineAudioModeChange() { 1470 if (mSource == NULL || mAudioSink == NULL) { 1471 return; 1472 } 1473 1474 if (mRenderer == NULL) { 1475 ALOGW("No renderer can be used to determine audio mode. Use non-offload for safety."); 1476 mOffloadAudio = false; 1477 return; 1478 } 1479 1480 sp<MetaData> audioMeta = mSource->getFormatMeta(true /* audio */); 1481 sp<AMessage> videoFormat = mSource->getFormat(false /* audio */); 1482 audio_stream_type_t streamType = mAudioSink->getAudioStreamType(); 1483 const bool hasVideo = (videoFormat != NULL); 1484 const bool canOffload = canOffloadStream( 1485 audioMeta, hasVideo, mSource->isStreaming(), streamType); 1486 if (canOffload) { 1487 if (!mOffloadAudio) { 1488 mRenderer->signalEnableOffloadAudio(); 1489 } 1490 // open audio sink early under offload mode. 1491 sp<AMessage> format = mSource->getFormat(true /*audio*/); 1492 tryOpenAudioSinkForOffload(format, hasVideo); 1493 } else { 1494 if (mOffloadAudio) { 1495 mRenderer->signalDisableOffloadAudio(); 1496 mOffloadAudio = false; 1497 } 1498 } 1499} 1500 1501status_t NuPlayer::instantiateDecoder(bool audio, sp<DecoderBase> *decoder) { 1502 // The audio decoder could be cleared by tear down. If still in shut down 1503 // process, no need to create a new audio decoder. 1504 if (*decoder != NULL || (audio && mFlushingAudio == SHUT_DOWN)) { 1505 return OK; 1506 } 1507 1508 sp<AMessage> format = mSource->getFormat(audio); 1509 1510 if (format == NULL) { 1511 return -EWOULDBLOCK; 1512 } 1513 1514 format->setInt32("priority", 0 /* realtime */); 1515 1516 if (!audio) { 1517 AString mime; 1518 CHECK(format->findString("mime", &mime)); 1519 1520 sp<AMessage> ccNotify = new AMessage(kWhatClosedCaptionNotify, this); 1521 if (mCCDecoder == NULL) { 1522 mCCDecoder = new CCDecoder(ccNotify); 1523 } 1524 1525 if (mSourceFlags & Source::FLAG_SECURE) { 1526 format->setInt32("secure", true); 1527 } 1528 1529 if (mSourceFlags & Source::FLAG_PROTECTED) { 1530 format->setInt32("protected", true); 1531 } 1532 1533 float rate = getFrameRate(); 1534 if (rate > 0) { 1535 format->setFloat("operating-rate", rate * mPlaybackSettings.mSpeed); 1536 } 1537 } 1538 1539 if (audio) { 1540 sp<AMessage> notify = new AMessage(kWhatAudioNotify, this); 1541 ++mAudioDecoderGeneration; 1542 notify->setInt32("generation", mAudioDecoderGeneration); 1543 1544 determineAudioModeChange(); 1545 if (mOffloadAudio) { 1546 const bool hasVideo = (mSource->getFormat(false /*audio */) != NULL); 1547 format->setInt32("has-video", hasVideo); 1548 *decoder = new DecoderPassThrough(notify, mSource, mRenderer); 1549 } else { 1550 *decoder = new Decoder(notify, mSource, mPID, mRenderer); 1551 } 1552 } else { 1553 sp<AMessage> notify = new AMessage(kWhatVideoNotify, this); 1554 ++mVideoDecoderGeneration; 1555 notify->setInt32("generation", mVideoDecoderGeneration); 1556 1557 *decoder = new Decoder( 1558 notify, mSource, mPID, mRenderer, mSurface, mCCDecoder); 1559 1560 // enable FRC if high-quality AV sync is requested, even if not 1561 // directly queuing to display, as this will even improve textureview 1562 // playback. 1563 { 1564 char value[PROPERTY_VALUE_MAX]; 1565 if (property_get("persist.sys.media.avsync", value, NULL) && 1566 (!strcmp("1", value) || !strcasecmp("true", value))) { 1567 format->setInt32("auto-frc", 1); 1568 } 1569 } 1570 } 1571 (*decoder)->init(); 1572 (*decoder)->configure(format); 1573 1574 // allocate buffers to decrypt widevine source buffers 1575 if (!audio && (mSourceFlags & Source::FLAG_SECURE)) { 1576 Vector<sp<ABuffer> > inputBufs; 1577 CHECK_EQ((*decoder)->getInputBuffers(&inputBufs), (status_t)OK); 1578 1579 Vector<MediaBuffer *> mediaBufs; 1580 for (size_t i = 0; i < inputBufs.size(); i++) { 1581 const sp<ABuffer> &buffer = inputBufs[i]; 1582 MediaBuffer *mbuf = new MediaBuffer(buffer->data(), buffer->size()); 1583 mediaBufs.push(mbuf); 1584 } 1585 1586 status_t err = mSource->setBuffers(audio, mediaBufs); 1587 if (err != OK) { 1588 for (size_t i = 0; i < mediaBufs.size(); ++i) { 1589 mediaBufs[i]->release(); 1590 } 1591 mediaBufs.clear(); 1592 ALOGE("Secure source didn't support secure mediaBufs."); 1593 return err; 1594 } 1595 } 1596 return OK; 1597} 1598 1599void NuPlayer::updateVideoSize( 1600 const sp<AMessage> &inputFormat, 1601 const sp<AMessage> &outputFormat) { 1602 if (inputFormat == NULL) { 1603 ALOGW("Unknown video size, reporting 0x0!"); 1604 notifyListener(MEDIA_SET_VIDEO_SIZE, 0, 0); 1605 return; 1606 } 1607 1608 int32_t displayWidth, displayHeight; 1609 if (outputFormat != NULL) { 1610 int32_t width, height; 1611 CHECK(outputFormat->findInt32("width", &width)); 1612 CHECK(outputFormat->findInt32("height", &height)); 1613 1614 int32_t cropLeft, cropTop, cropRight, cropBottom; 1615 CHECK(outputFormat->findRect( 1616 "crop", 1617 &cropLeft, &cropTop, &cropRight, &cropBottom)); 1618 1619 displayWidth = cropRight - cropLeft + 1; 1620 displayHeight = cropBottom - cropTop + 1; 1621 1622 ALOGV("Video output format changed to %d x %d " 1623 "(crop: %d x %d @ (%d, %d))", 1624 width, height, 1625 displayWidth, 1626 displayHeight, 1627 cropLeft, cropTop); 1628 } else { 1629 CHECK(inputFormat->findInt32("width", &displayWidth)); 1630 CHECK(inputFormat->findInt32("height", &displayHeight)); 1631 1632 ALOGV("Video input format %d x %d", displayWidth, displayHeight); 1633 } 1634 1635 // Take into account sample aspect ratio if necessary: 1636 int32_t sarWidth, sarHeight; 1637 if (inputFormat->findInt32("sar-width", &sarWidth) 1638 && inputFormat->findInt32("sar-height", &sarHeight)) { 1639 ALOGV("Sample aspect ratio %d : %d", sarWidth, sarHeight); 1640 1641 displayWidth = (displayWidth * sarWidth) / sarHeight; 1642 1643 ALOGV("display dimensions %d x %d", displayWidth, displayHeight); 1644 } 1645 1646 int32_t rotationDegrees; 1647 if (!inputFormat->findInt32("rotation-degrees", &rotationDegrees)) { 1648 rotationDegrees = 0; 1649 } 1650 1651 if (rotationDegrees == 90 || rotationDegrees == 270) { 1652 int32_t tmp = displayWidth; 1653 displayWidth = displayHeight; 1654 displayHeight = tmp; 1655 } 1656 1657 notifyListener( 1658 MEDIA_SET_VIDEO_SIZE, 1659 displayWidth, 1660 displayHeight); 1661} 1662 1663void NuPlayer::notifyListener(int msg, int ext1, int ext2, const Parcel *in) { 1664 if (mDriver == NULL) { 1665 return; 1666 } 1667 1668 sp<NuPlayerDriver> driver = mDriver.promote(); 1669 1670 if (driver == NULL) { 1671 return; 1672 } 1673 1674 driver->notifyListener(msg, ext1, ext2, in); 1675} 1676 1677void NuPlayer::flushDecoder(bool audio, bool needShutdown) { 1678 ALOGV("[%s] flushDecoder needShutdown=%d", 1679 audio ? "audio" : "video", needShutdown); 1680 1681 const sp<DecoderBase> &decoder = getDecoder(audio); 1682 if (decoder == NULL) { 1683 ALOGI("flushDecoder %s without decoder present", 1684 audio ? "audio" : "video"); 1685 return; 1686 } 1687 1688 // Make sure we don't continue to scan sources until we finish flushing. 1689 ++mScanSourcesGeneration; 1690 if (mScanSourcesPending) { 1691 mDeferredActions.push_back( 1692 new SimpleAction(&NuPlayer::performScanSources)); 1693 mScanSourcesPending = false; 1694 } 1695 1696 decoder->signalFlush(); 1697 1698 FlushStatus newStatus = 1699 needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 1700 1701 mFlushComplete[audio][false /* isDecoder */] = (mRenderer == NULL); 1702 mFlushComplete[audio][true /* isDecoder */] = false; 1703 if (audio) { 1704 ALOGE_IF(mFlushingAudio != NONE, 1705 "audio flushDecoder() is called in state %d", mFlushingAudio); 1706 mFlushingAudio = newStatus; 1707 } else { 1708 ALOGE_IF(mFlushingVideo != NONE, 1709 "video flushDecoder() is called in state %d", mFlushingVideo); 1710 mFlushingVideo = newStatus; 1711 } 1712} 1713 1714void NuPlayer::queueDecoderShutdown( 1715 bool audio, bool video, const sp<AMessage> &reply) { 1716 ALOGI("queueDecoderShutdown audio=%d, video=%d", audio, video); 1717 1718 mDeferredActions.push_back( 1719 new FlushDecoderAction( 1720 audio ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE, 1721 video ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE)); 1722 1723 mDeferredActions.push_back( 1724 new SimpleAction(&NuPlayer::performScanSources)); 1725 1726 mDeferredActions.push_back(new PostMessageAction(reply)); 1727 1728 processDeferredActions(); 1729} 1730 1731status_t NuPlayer::setVideoScalingMode(int32_t mode) { 1732 mVideoScalingMode = mode; 1733 if (mSurface != NULL) { 1734 status_t ret = native_window_set_scaling_mode(mSurface.get(), mVideoScalingMode); 1735 if (ret != OK) { 1736 ALOGE("Failed to set scaling mode (%d): %s", 1737 -ret, strerror(-ret)); 1738 return ret; 1739 } 1740 } 1741 return OK; 1742} 1743 1744status_t NuPlayer::getTrackInfo(Parcel* reply) const { 1745 sp<AMessage> msg = new AMessage(kWhatGetTrackInfo, this); 1746 msg->setPointer("reply", reply); 1747 1748 sp<AMessage> response; 1749 status_t err = msg->postAndAwaitResponse(&response); 1750 return err; 1751} 1752 1753status_t NuPlayer::getSelectedTrack(int32_t type, Parcel* reply) const { 1754 sp<AMessage> msg = new AMessage(kWhatGetSelectedTrack, this); 1755 msg->setPointer("reply", reply); 1756 msg->setInt32("type", type); 1757 1758 sp<AMessage> response; 1759 status_t err = msg->postAndAwaitResponse(&response); 1760 if (err == OK && response != NULL) { 1761 CHECK(response->findInt32("err", &err)); 1762 } 1763 return err; 1764} 1765 1766status_t NuPlayer::selectTrack(size_t trackIndex, bool select, int64_t timeUs) { 1767 sp<AMessage> msg = new AMessage(kWhatSelectTrack, this); 1768 msg->setSize("trackIndex", trackIndex); 1769 msg->setInt32("select", select); 1770 msg->setInt64("timeUs", timeUs); 1771 1772 sp<AMessage> response; 1773 status_t err = msg->postAndAwaitResponse(&response); 1774 1775 if (err != OK) { 1776 return err; 1777 } 1778 1779 if (!response->findInt32("err", &err)) { 1780 err = OK; 1781 } 1782 1783 return err; 1784} 1785 1786status_t NuPlayer::getCurrentPosition(int64_t *mediaUs) { 1787 sp<Renderer> renderer = mRenderer; 1788 if (renderer == NULL) { 1789 return NO_INIT; 1790 } 1791 1792 return renderer->getCurrentPosition(mediaUs); 1793} 1794 1795void NuPlayer::getStats(Vector<sp<AMessage> > *mTrackStats) { 1796 CHECK(mTrackStats != NULL); 1797 1798 mTrackStats->clear(); 1799 if (mVideoDecoder != NULL) { 1800 mTrackStats->push_back(mVideoDecoder->getStats()); 1801 } 1802 if (mAudioDecoder != NULL) { 1803 mTrackStats->push_back(mAudioDecoder->getStats()); 1804 } 1805} 1806 1807sp<MetaData> NuPlayer::getFileMeta() { 1808 return mSource->getFileFormatMeta(); 1809} 1810 1811float NuPlayer::getFrameRate() { 1812 sp<MetaData> meta = mSource->getFormatMeta(false /* audio */); 1813 if (meta == NULL) { 1814 return 0; 1815 } 1816 int32_t rate; 1817 if (!meta->findInt32(kKeyFrameRate, &rate)) { 1818 // fall back to try file meta 1819 sp<MetaData> fileMeta = getFileMeta(); 1820 if (fileMeta == NULL) { 1821 ALOGW("source has video meta but not file meta"); 1822 return -1; 1823 } 1824 int32_t fileMetaRate; 1825 if (!fileMeta->findInt32(kKeyFrameRate, &fileMetaRate)) { 1826 return -1; 1827 } 1828 return fileMetaRate; 1829 } 1830 return rate; 1831} 1832 1833void NuPlayer::schedulePollDuration() { 1834 sp<AMessage> msg = new AMessage(kWhatPollDuration, this); 1835 msg->setInt32("generation", mPollDurationGeneration); 1836 msg->post(); 1837} 1838 1839void NuPlayer::cancelPollDuration() { 1840 ++mPollDurationGeneration; 1841} 1842 1843void NuPlayer::processDeferredActions() { 1844 while (!mDeferredActions.empty()) { 1845 // We won't execute any deferred actions until we're no longer in 1846 // an intermediate state, i.e. one more more decoders are currently 1847 // flushing or shutting down. 1848 1849 if (mFlushingAudio != NONE || mFlushingVideo != NONE) { 1850 // We're currently flushing, postpone the reset until that's 1851 // completed. 1852 1853 ALOGV("postponing action mFlushingAudio=%d, mFlushingVideo=%d", 1854 mFlushingAudio, mFlushingVideo); 1855 1856 break; 1857 } 1858 1859 sp<Action> action = *mDeferredActions.begin(); 1860 mDeferredActions.erase(mDeferredActions.begin()); 1861 1862 action->execute(this); 1863 } 1864} 1865 1866void NuPlayer::performSeek(int64_t seekTimeUs) { 1867 ALOGV("performSeek seekTimeUs=%lld us (%.2f secs)", 1868 (long long)seekTimeUs, 1869 seekTimeUs / 1E6); 1870 1871 if (mSource == NULL) { 1872 // This happens when reset occurs right before the loop mode 1873 // asynchronously seeks to the start of the stream. 1874 LOG_ALWAYS_FATAL_IF(mAudioDecoder != NULL || mVideoDecoder != NULL, 1875 "mSource is NULL and decoders not NULL audio(%p) video(%p)", 1876 mAudioDecoder.get(), mVideoDecoder.get()); 1877 return; 1878 } 1879 mPreviousSeekTimeUs = seekTimeUs; 1880 mSource->seekTo(seekTimeUs); 1881 ++mTimedTextGeneration; 1882 1883 // everything's flushed, continue playback. 1884} 1885 1886void NuPlayer::performDecoderFlush(FlushCommand audio, FlushCommand video) { 1887 ALOGV("performDecoderFlush audio=%d, video=%d", audio, video); 1888 1889 if ((audio == FLUSH_CMD_NONE || mAudioDecoder == NULL) 1890 && (video == FLUSH_CMD_NONE || mVideoDecoder == NULL)) { 1891 return; 1892 } 1893 1894 if (audio != FLUSH_CMD_NONE && mAudioDecoder != NULL) { 1895 flushDecoder(true /* audio */, (audio == FLUSH_CMD_SHUTDOWN)); 1896 } 1897 1898 if (video != FLUSH_CMD_NONE && mVideoDecoder != NULL) { 1899 flushDecoder(false /* audio */, (video == FLUSH_CMD_SHUTDOWN)); 1900 } 1901} 1902 1903void NuPlayer::performReset() { 1904 ALOGV("performReset"); 1905 1906 CHECK(mAudioDecoder == NULL); 1907 CHECK(mVideoDecoder == NULL); 1908 1909 cancelPollDuration(); 1910 1911 ++mScanSourcesGeneration; 1912 mScanSourcesPending = false; 1913 1914 if (mRendererLooper != NULL) { 1915 if (mRenderer != NULL) { 1916 mRendererLooper->unregisterHandler(mRenderer->id()); 1917 } 1918 mRendererLooper->stop(); 1919 mRendererLooper.clear(); 1920 } 1921 mRenderer.clear(); 1922 ++mRendererGeneration; 1923 1924 if (mSource != NULL) { 1925 mSource->stop(); 1926 1927 mSource.clear(); 1928 } 1929 1930 if (mDriver != NULL) { 1931 sp<NuPlayerDriver> driver = mDriver.promote(); 1932 if (driver != NULL) { 1933 driver->notifyResetComplete(); 1934 } 1935 } 1936 1937 mStarted = false; 1938 mSourceStarted = false; 1939} 1940 1941void NuPlayer::performScanSources() { 1942 ALOGV("performScanSources"); 1943 1944 if (!mStarted) { 1945 return; 1946 } 1947 1948 if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 1949 postScanSources(); 1950 } 1951} 1952 1953void NuPlayer::performSetSurface(const sp<Surface> &surface) { 1954 ALOGV("performSetSurface"); 1955 1956 mSurface = surface; 1957 1958 // XXX - ignore error from setVideoScalingMode for now 1959 setVideoScalingMode(mVideoScalingMode); 1960 1961 if (mDriver != NULL) { 1962 sp<NuPlayerDriver> driver = mDriver.promote(); 1963 if (driver != NULL) { 1964 driver->notifySetSurfaceComplete(); 1965 } 1966 } 1967} 1968 1969void NuPlayer::performResumeDecoders(bool needNotify) { 1970 if (needNotify) { 1971 mResumePending = true; 1972 if (mVideoDecoder == NULL) { 1973 // if audio-only, we can notify seek complete now, 1974 // as the resume operation will be relatively fast. 1975 finishResume(); 1976 } 1977 } 1978 1979 if (mVideoDecoder != NULL) { 1980 // When there is continuous seek, MediaPlayer will cache the seek 1981 // position, and send down new seek request when previous seek is 1982 // complete. Let's wait for at least one video output frame before 1983 // notifying seek complete, so that the video thumbnail gets updated 1984 // when seekbar is dragged. 1985 mVideoDecoder->signalResume(needNotify); 1986 } 1987 1988 if (mAudioDecoder != NULL) { 1989 mAudioDecoder->signalResume(false /* needNotify */); 1990 } 1991} 1992 1993void NuPlayer::finishResume() { 1994 if (mResumePending) { 1995 mResumePending = false; 1996 notifyDriverSeekComplete(); 1997 } 1998} 1999 2000void NuPlayer::notifyDriverSeekComplete() { 2001 if (mDriver != NULL) { 2002 sp<NuPlayerDriver> driver = mDriver.promote(); 2003 if (driver != NULL) { 2004 driver->notifySeekComplete(); 2005 } 2006 } 2007} 2008 2009void NuPlayer::onSourceNotify(const sp<AMessage> &msg) { 2010 int32_t what; 2011 CHECK(msg->findInt32("what", &what)); 2012 2013 switch (what) { 2014 case Source::kWhatInstantiateSecureDecoders: 2015 { 2016 if (mSource == NULL) { 2017 // This is a stale notification from a source that was 2018 // asynchronously preparing when the client called reset(). 2019 // We handled the reset, the source is gone. 2020 break; 2021 } 2022 2023 sp<AMessage> reply; 2024 CHECK(msg->findMessage("reply", &reply)); 2025 status_t err = onInstantiateSecureDecoders(); 2026 reply->setInt32("err", err); 2027 reply->post(); 2028 break; 2029 } 2030 2031 case Source::kWhatPrepared: 2032 { 2033 if (mSource == NULL) { 2034 // This is a stale notification from a source that was 2035 // asynchronously preparing when the client called reset(). 2036 // We handled the reset, the source is gone. 2037 break; 2038 } 2039 2040 int32_t err; 2041 CHECK(msg->findInt32("err", &err)); 2042 2043 if (err != OK) { 2044 // shut down potential secure codecs in case client never calls reset 2045 mDeferredActions.push_back( 2046 new FlushDecoderAction(FLUSH_CMD_SHUTDOWN /* audio */, 2047 FLUSH_CMD_SHUTDOWN /* video */)); 2048 processDeferredActions(); 2049 } 2050 2051 sp<NuPlayerDriver> driver = mDriver.promote(); 2052 if (driver != NULL) { 2053 // notify duration first, so that it's definitely set when 2054 // the app received the "prepare complete" callback. 2055 int64_t durationUs; 2056 if (mSource->getDuration(&durationUs) == OK) { 2057 driver->notifyDuration(durationUs); 2058 } 2059 driver->notifyPrepareCompleted(err); 2060 } 2061 2062 break; 2063 } 2064 2065 case Source::kWhatFlagsChanged: 2066 { 2067 uint32_t flags; 2068 CHECK(msg->findInt32("flags", (int32_t *)&flags)); 2069 2070 sp<NuPlayerDriver> driver = mDriver.promote(); 2071 if (driver != NULL) { 2072 if ((flags & NuPlayer::Source::FLAG_CAN_SEEK) == 0) { 2073 driver->notifyListener( 2074 MEDIA_INFO, MEDIA_INFO_NOT_SEEKABLE, 0); 2075 } 2076 driver->notifyFlagsChanged(flags); 2077 } 2078 2079 if ((mSourceFlags & Source::FLAG_DYNAMIC_DURATION) 2080 && (!(flags & Source::FLAG_DYNAMIC_DURATION))) { 2081 cancelPollDuration(); 2082 } else if (!(mSourceFlags & Source::FLAG_DYNAMIC_DURATION) 2083 && (flags & Source::FLAG_DYNAMIC_DURATION) 2084 && (mAudioDecoder != NULL || mVideoDecoder != NULL)) { 2085 schedulePollDuration(); 2086 } 2087 2088 mSourceFlags = flags; 2089 break; 2090 } 2091 2092 case Source::kWhatVideoSizeChanged: 2093 { 2094 sp<AMessage> format; 2095 CHECK(msg->findMessage("format", &format)); 2096 2097 updateVideoSize(format); 2098 break; 2099 } 2100 2101 case Source::kWhatBufferingUpdate: 2102 { 2103 int32_t percentage; 2104 CHECK(msg->findInt32("percentage", &percentage)); 2105 2106 notifyListener(MEDIA_BUFFERING_UPDATE, percentage, 0); 2107 break; 2108 } 2109 2110 case Source::kWhatPauseOnBufferingStart: 2111 { 2112 // ignore if not playing 2113 if (mStarted) { 2114 ALOGI("buffer low, pausing..."); 2115 2116 mPausedForBuffering = true; 2117 onPause(); 2118 } 2119 // fall-thru 2120 } 2121 2122 case Source::kWhatBufferingStart: 2123 { 2124 notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_START, 0); 2125 break; 2126 } 2127 2128 case Source::kWhatResumeOnBufferingEnd: 2129 { 2130 // ignore if not playing 2131 if (mStarted) { 2132 ALOGI("buffer ready, resuming..."); 2133 2134 mPausedForBuffering = false; 2135 2136 // do not resume yet if client didn't unpause 2137 if (!mPausedByClient) { 2138 onResume(); 2139 } 2140 } 2141 // fall-thru 2142 } 2143 2144 case Source::kWhatBufferingEnd: 2145 { 2146 notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_END, 0); 2147 break; 2148 } 2149 2150 case Source::kWhatCacheStats: 2151 { 2152 int32_t kbps; 2153 CHECK(msg->findInt32("bandwidth", &kbps)); 2154 2155 notifyListener(MEDIA_INFO, MEDIA_INFO_NETWORK_BANDWIDTH, kbps); 2156 break; 2157 } 2158 2159 case Source::kWhatSubtitleData: 2160 { 2161 sp<ABuffer> buffer; 2162 CHECK(msg->findBuffer("buffer", &buffer)); 2163 2164 sendSubtitleData(buffer, 0 /* baseIndex */); 2165 break; 2166 } 2167 2168 case Source::kWhatTimedMetaData: 2169 { 2170 sp<ABuffer> buffer; 2171 if (!msg->findBuffer("buffer", &buffer)) { 2172 notifyListener(MEDIA_INFO, MEDIA_INFO_METADATA_UPDATE, 0); 2173 } else { 2174 sendTimedMetaData(buffer); 2175 } 2176 break; 2177 } 2178 2179 case Source::kWhatTimedTextData: 2180 { 2181 int32_t generation; 2182 if (msg->findInt32("generation", &generation) 2183 && generation != mTimedTextGeneration) { 2184 break; 2185 } 2186 2187 sp<ABuffer> buffer; 2188 CHECK(msg->findBuffer("buffer", &buffer)); 2189 2190 sp<NuPlayerDriver> driver = mDriver.promote(); 2191 if (driver == NULL) { 2192 break; 2193 } 2194 2195 int posMs; 2196 int64_t timeUs, posUs; 2197 driver->getCurrentPosition(&posMs); 2198 posUs = posMs * 1000; 2199 CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 2200 2201 if (posUs < timeUs) { 2202 if (!msg->findInt32("generation", &generation)) { 2203 msg->setInt32("generation", mTimedTextGeneration); 2204 } 2205 msg->post(timeUs - posUs); 2206 } else { 2207 sendTimedTextData(buffer); 2208 } 2209 break; 2210 } 2211 2212 case Source::kWhatQueueDecoderShutdown: 2213 { 2214 int32_t audio, video; 2215 CHECK(msg->findInt32("audio", &audio)); 2216 CHECK(msg->findInt32("video", &video)); 2217 2218 sp<AMessage> reply; 2219 CHECK(msg->findMessage("reply", &reply)); 2220 2221 queueDecoderShutdown(audio, video, reply); 2222 break; 2223 } 2224 2225 case Source::kWhatDrmNoLicense: 2226 { 2227 notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE); 2228 break; 2229 } 2230 2231 default: 2232 TRESPASS(); 2233 } 2234} 2235 2236void NuPlayer::onClosedCaptionNotify(const sp<AMessage> &msg) { 2237 int32_t what; 2238 CHECK(msg->findInt32("what", &what)); 2239 2240 switch (what) { 2241 case NuPlayer::CCDecoder::kWhatClosedCaptionData: 2242 { 2243 sp<ABuffer> buffer; 2244 CHECK(msg->findBuffer("buffer", &buffer)); 2245 2246 size_t inbandTracks = 0; 2247 if (mSource != NULL) { 2248 inbandTracks = mSource->getTrackCount(); 2249 } 2250 2251 sendSubtitleData(buffer, inbandTracks); 2252 break; 2253 } 2254 2255 case NuPlayer::CCDecoder::kWhatTrackAdded: 2256 { 2257 notifyListener(MEDIA_INFO, MEDIA_INFO_METADATA_UPDATE, 0); 2258 2259 break; 2260 } 2261 2262 default: 2263 TRESPASS(); 2264 } 2265 2266 2267} 2268 2269void NuPlayer::sendSubtitleData(const sp<ABuffer> &buffer, int32_t baseIndex) { 2270 int32_t trackIndex; 2271 int64_t timeUs, durationUs; 2272 CHECK(buffer->meta()->findInt32("trackIndex", &trackIndex)); 2273 CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 2274 CHECK(buffer->meta()->findInt64("durationUs", &durationUs)); 2275 2276 Parcel in; 2277 in.writeInt32(trackIndex + baseIndex); 2278 in.writeInt64(timeUs); 2279 in.writeInt64(durationUs); 2280 in.writeInt32(buffer->size()); 2281 in.writeInt32(buffer->size()); 2282 in.write(buffer->data(), buffer->size()); 2283 2284 notifyListener(MEDIA_SUBTITLE_DATA, 0, 0, &in); 2285} 2286 2287void NuPlayer::sendTimedMetaData(const sp<ABuffer> &buffer) { 2288 int64_t timeUs; 2289 CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 2290 2291 Parcel in; 2292 in.writeInt64(timeUs); 2293 in.writeInt32(buffer->size()); 2294 in.writeInt32(buffer->size()); 2295 in.write(buffer->data(), buffer->size()); 2296 2297 notifyListener(MEDIA_META_DATA, 0, 0, &in); 2298} 2299 2300void NuPlayer::sendTimedTextData(const sp<ABuffer> &buffer) { 2301 const void *data; 2302 size_t size = 0; 2303 int64_t timeUs; 2304 int32_t flag = TextDescriptions::IN_BAND_TEXT_3GPP; 2305 2306 AString mime; 2307 CHECK(buffer->meta()->findString("mime", &mime)); 2308 CHECK(strcasecmp(mime.c_str(), MEDIA_MIMETYPE_TEXT_3GPP) == 0); 2309 2310 data = buffer->data(); 2311 size = buffer->size(); 2312 2313 Parcel parcel; 2314 if (size > 0) { 2315 CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 2316 int32_t global = 0; 2317 if (buffer->meta()->findInt32("global", &global) && global) { 2318 flag |= TextDescriptions::GLOBAL_DESCRIPTIONS; 2319 } else { 2320 flag |= TextDescriptions::LOCAL_DESCRIPTIONS; 2321 } 2322 TextDescriptions::getParcelOfDescriptions( 2323 (const uint8_t *)data, size, flag, timeUs / 1000, &parcel); 2324 } 2325 2326 if ((parcel.dataSize() > 0)) { 2327 notifyListener(MEDIA_TIMED_TEXT, 0, 0, &parcel); 2328 } else { // send an empty timed text 2329 notifyListener(MEDIA_TIMED_TEXT, 0, 0); 2330 } 2331} 2332//////////////////////////////////////////////////////////////////////////////// 2333 2334sp<AMessage> NuPlayer::Source::getFormat(bool audio) { 2335 sp<MetaData> meta = getFormatMeta(audio); 2336 2337 if (meta == NULL) { 2338 return NULL; 2339 } 2340 2341 sp<AMessage> msg = new AMessage; 2342 2343 if(convertMetaDataToMessage(meta, &msg) == OK) { 2344 return msg; 2345 } 2346 return NULL; 2347} 2348 2349void NuPlayer::Source::notifyFlagsChanged(uint32_t flags) { 2350 sp<AMessage> notify = dupNotify(); 2351 notify->setInt32("what", kWhatFlagsChanged); 2352 notify->setInt32("flags", flags); 2353 notify->post(); 2354} 2355 2356void NuPlayer::Source::notifyVideoSizeChanged(const sp<AMessage> &format) { 2357 sp<AMessage> notify = dupNotify(); 2358 notify->setInt32("what", kWhatVideoSizeChanged); 2359 notify->setMessage("format", format); 2360 notify->post(); 2361} 2362 2363void NuPlayer::Source::notifyPrepared(status_t err) { 2364 sp<AMessage> notify = dupNotify(); 2365 notify->setInt32("what", kWhatPrepared); 2366 notify->setInt32("err", err); 2367 notify->post(); 2368} 2369 2370void NuPlayer::Source::notifyInstantiateSecureDecoders(const sp<AMessage> &reply) { 2371 sp<AMessage> notify = dupNotify(); 2372 notify->setInt32("what", kWhatInstantiateSecureDecoders); 2373 notify->setMessage("reply", reply); 2374 notify->post(); 2375} 2376 2377void NuPlayer::Source::onMessageReceived(const sp<AMessage> & /* msg */) { 2378 TRESPASS(); 2379} 2380 2381} // namespace android 2382