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