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