NuPlayer.cpp revision 1de83d5a634116c9b28490d5f5be61868fb8cbd1
1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17//#define LOG_NDEBUG 0
18#define LOG_TAG "NuPlayer"
19#include <utils/Log.h>
20
21#include "NuPlayer.h"
22
23#include "HTTPLiveSource.h"
24#include "NuPlayerCCDecoder.h"
25#include "NuPlayerDecoder.h"
26#include "NuPlayerDecoderBase.h"
27#include "NuPlayerDecoderPassThrough.h"
28#include "NuPlayerDriver.h"
29#include "NuPlayerRenderer.h"
30#include "NuPlayerSource.h"
31#include "RTSPSource.h"
32#include "StreamingSource.h"
33#include "GenericSource.h"
34#include "TextDescriptions.h"
35
36#include "ATSParser.h"
37
38#include <cutils/properties.h>
39
40#include <media/AudioResamplerPublic.h>
41#include <media/AVSyncSettings.h>
42
43#include <media/stagefright/foundation/hexdump.h>
44#include <media/stagefright/foundation/ABuffer.h>
45#include <media/stagefright/foundation/ADebug.h>
46#include <media/stagefright/foundation/AMessage.h>
47#include <media/stagefright/MediaBuffer.h>
48#include <media/stagefright/MediaDefs.h>
49#include <media/stagefright/MediaErrors.h>
50#include <media/stagefright/MetaData.h>
51
52#include <gui/IGraphicBufferProducer.h>
53#include <gui/Surface.h>
54
55#include "avc_utils.h"
56
57#include "ESDS.h"
58#include <media/stagefright/Utils.h>
59
60namespace android {
61
62struct NuPlayer::Action : public RefBase {
63    Action() {}
64
65    virtual void execute(NuPlayer *player) = 0;
66
67private:
68    DISALLOW_EVIL_CONSTRUCTORS(Action);
69};
70
71struct NuPlayer::SeekAction : public Action {
72    SeekAction(int64_t seekTimeUs)
73        : mSeekTimeUs(seekTimeUs) {
74    }
75
76    virtual void execute(NuPlayer *player) {
77        player->performSeek(mSeekTimeUs);
78    }
79
80private:
81    int64_t mSeekTimeUs;
82
83    DISALLOW_EVIL_CONSTRUCTORS(SeekAction);
84};
85
86struct NuPlayer::ResumeDecoderAction : public Action {
87    ResumeDecoderAction(bool needNotify)
88        : mNeedNotify(needNotify) {
89    }
90
91    virtual void execute(NuPlayer *player) {
92        player->performResumeDecoders(mNeedNotify);
93    }
94
95private:
96    bool mNeedNotify;
97
98    DISALLOW_EVIL_CONSTRUCTORS(ResumeDecoderAction);
99};
100
101struct NuPlayer::SetSurfaceAction : public Action {
102    SetSurfaceAction(const sp<Surface> &surface)
103        : mSurface(surface) {
104    }
105
106    virtual void execute(NuPlayer *player) {
107        player->performSetSurface(mSurface);
108    }
109
110private:
111    sp<Surface> mSurface;
112
113    DISALLOW_EVIL_CONSTRUCTORS(SetSurfaceAction);
114};
115
116struct NuPlayer::FlushDecoderAction : public Action {
117    FlushDecoderAction(FlushCommand audio, FlushCommand video)
118        : mAudio(audio),
119          mVideo(video) {
120    }
121
122    virtual void execute(NuPlayer *player) {
123        player->performDecoderFlush(mAudio, mVideo);
124    }
125
126private:
127    FlushCommand mAudio;
128    FlushCommand mVideo;
129
130    DISALLOW_EVIL_CONSTRUCTORS(FlushDecoderAction);
131};
132
133struct NuPlayer::PostMessageAction : public Action {
134    PostMessageAction(const sp<AMessage> &msg)
135        : mMessage(msg) {
136    }
137
138    virtual void execute(NuPlayer *) {
139        mMessage->post();
140    }
141
142private:
143    sp<AMessage> mMessage;
144
145    DISALLOW_EVIL_CONSTRUCTORS(PostMessageAction);
146};
147
148// Use this if there's no state necessary to save in order to execute
149// the action.
150struct NuPlayer::SimpleAction : public Action {
151    typedef void (NuPlayer::*ActionFunc)();
152
153    SimpleAction(ActionFunc func)
154        : mFunc(func) {
155    }
156
157    virtual void execute(NuPlayer *player) {
158        (player->*mFunc)();
159    }
160
161private:
162    ActionFunc mFunc;
163
164    DISALLOW_EVIL_CONSTRUCTORS(SimpleAction);
165};
166
167////////////////////////////////////////////////////////////////////////////////
168
169NuPlayer::NuPlayer(pid_t pid)
170    : mUIDValid(false),
171      mPID(pid),
172      mSourceFlags(0),
173      mOffloadAudio(false),
174      mAudioDecoderGeneration(0),
175      mVideoDecoderGeneration(0),
176      mRendererGeneration(0),
177      mPreviousSeekTimeUs(0),
178      mAudioEOS(false),
179      mVideoEOS(false),
180      mScanSourcesPending(false),
181      mScanSourcesGeneration(0),
182      mPollDurationGeneration(0),
183      mTimedTextGeneration(0),
184      mFlushingAudio(NONE),
185      mFlushingVideo(NONE),
186      mResumePending(false),
187      mVideoScalingMode(NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW),
188      mPlaybackSettings(AUDIO_PLAYBACK_RATE_DEFAULT),
189      mVideoFpsHint(-1.f),
190      mStarted(false),
191      mPrepared(false),
192      mResetting(false),
193      mSourceStarted(false),
194      mPaused(false),
195      mPausedByClient(true),
196      mPausedForBuffering(false) {
197    clearFlushComplete();
198}
199
200NuPlayer::~NuPlayer() {
201}
202
203void NuPlayer::setUID(uid_t uid) {
204    mUIDValid = true;
205    mUID = uid;
206}
207
208void NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) {
209    mDriver = driver;
210}
211
212void 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
221static 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
238void 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
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, 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
430void 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
481void 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                sp<AMessage> params = new AMessage();
788                params->setFloat("playback-speed", mPlaybackSettings.mSpeed);
789                mVideoDecoder->setParameters(params);
790            }
791
792            sp<AMessage> response = new AMessage;
793            response->setInt32("err", err);
794            response->postReply(replyID);
795            break;
796        }
797
798        case kWhatGetPlaybackSettings:
799        {
800            sp<AReplyToken> replyID;
801            CHECK(msg->senderAwaitsResponse(&replyID));
802            AudioPlaybackRate rate = mPlaybackSettings;
803            status_t err = OK;
804            if (mRenderer != NULL) {
805                err = mRenderer->getPlaybackSettings(&rate);
806            }
807            if (err == OK) {
808                // get playback settings used by renderer, as it may be
809                // slightly off due to audiosink not taking small changes.
810                mPlaybackSettings = rate;
811                if (mPaused) {
812                    rate.mSpeed = 0.f;
813                }
814            }
815            sp<AMessage> response = new AMessage;
816            if (err == OK) {
817                writeToAMessage(response, rate);
818            }
819            response->setInt32("err", err);
820            response->postReply(replyID);
821            break;
822        }
823
824        case kWhatConfigSync:
825        {
826            sp<AReplyToken> replyID;
827            CHECK(msg->senderAwaitsResponse(&replyID));
828
829            ALOGV("kWhatConfigSync");
830            AVSyncSettings sync;
831            float videoFpsHint;
832            readFromAMessage(msg, &sync, &videoFpsHint);
833            status_t err = OK;
834            if (mRenderer != NULL) {
835                err = mRenderer->setSyncSettings(sync, videoFpsHint);
836            }
837            if (err == OK) {
838                mSyncSettings = sync;
839                mVideoFpsHint = videoFpsHint;
840            }
841            sp<AMessage> response = new AMessage;
842            response->setInt32("err", err);
843            response->postReply(replyID);
844            break;
845        }
846
847        case kWhatGetSyncSettings:
848        {
849            sp<AReplyToken> replyID;
850            CHECK(msg->senderAwaitsResponse(&replyID));
851            AVSyncSettings sync = mSyncSettings;
852            float videoFps = mVideoFpsHint;
853            status_t err = OK;
854            if (mRenderer != NULL) {
855                err = mRenderer->getSyncSettings(&sync, &videoFps);
856                if (err == OK) {
857                    mSyncSettings = sync;
858                    mVideoFpsHint = videoFps;
859                }
860            }
861            sp<AMessage> response = new AMessage;
862            if (err == OK) {
863                writeToAMessage(response, sync, videoFps);
864            }
865            response->setInt32("err", err);
866            response->postReply(replyID);
867            break;
868        }
869
870        case kWhatScanSources:
871        {
872            int32_t generation;
873            CHECK(msg->findInt32("generation", &generation));
874            if (generation != mScanSourcesGeneration) {
875                // Drop obsolete msg.
876                break;
877            }
878
879            mScanSourcesPending = false;
880
881            ALOGV("scanning sources haveAudio=%d, haveVideo=%d",
882                 mAudioDecoder != NULL, mVideoDecoder != NULL);
883
884            bool mHadAnySourcesBefore =
885                (mAudioDecoder != NULL) || (mVideoDecoder != NULL);
886            bool rescan = false;
887
888            // initialize video before audio because successful initialization of
889            // video may change deep buffer mode of audio.
890            if (mSurface != NULL) {
891                if (instantiateDecoder(false, &mVideoDecoder) == -EWOULDBLOCK) {
892                    rescan = true;
893                }
894            }
895
896            // Don't try to re-open audio sink if there's an existing decoder.
897            if (mAudioSink != NULL && mAudioDecoder == NULL) {
898                if (instantiateDecoder(true, &mAudioDecoder) == -EWOULDBLOCK) {
899                    rescan = true;
900                }
901            }
902
903            if (!mHadAnySourcesBefore
904                    && (mAudioDecoder != NULL || mVideoDecoder != NULL)) {
905                // This is the first time we've found anything playable.
906
907                if (mSourceFlags & Source::FLAG_DYNAMIC_DURATION) {
908                    schedulePollDuration();
909                }
910            }
911
912            status_t err;
913            if ((err = mSource->feedMoreTSData()) != OK) {
914                if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
915                    // We're not currently decoding anything (no audio or
916                    // video tracks found) and we just ran out of input data.
917
918                    if (err == ERROR_END_OF_STREAM) {
919                        notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
920                    } else {
921                        notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
922                    }
923                }
924                break;
925            }
926
927            if (rescan) {
928                msg->post(100000ll);
929                mScanSourcesPending = true;
930            }
931            break;
932        }
933
934        case kWhatVideoNotify:
935        case kWhatAudioNotify:
936        {
937            bool audio = msg->what() == kWhatAudioNotify;
938
939            int32_t currentDecoderGeneration =
940                (audio? mAudioDecoderGeneration : mVideoDecoderGeneration);
941            int32_t requesterGeneration = currentDecoderGeneration - 1;
942            CHECK(msg->findInt32("generation", &requesterGeneration));
943
944            if (requesterGeneration != currentDecoderGeneration) {
945                ALOGV("got message from old %s decoder, generation(%d:%d)",
946                        audio ? "audio" : "video", requesterGeneration,
947                        currentDecoderGeneration);
948                sp<AMessage> reply;
949                if (!(msg->findMessage("reply", &reply))) {
950                    return;
951                }
952
953                reply->setInt32("err", INFO_DISCONTINUITY);
954                reply->post();
955                return;
956            }
957
958            int32_t what;
959            CHECK(msg->findInt32("what", &what));
960
961            if (what == DecoderBase::kWhatInputDiscontinuity) {
962                int32_t formatChange;
963                CHECK(msg->findInt32("formatChange", &formatChange));
964
965                ALOGV("%s discontinuity: formatChange %d",
966                        audio ? "audio" : "video", formatChange);
967
968                if (formatChange) {
969                    mDeferredActions.push_back(
970                            new FlushDecoderAction(
971                                audio ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE,
972                                audio ? FLUSH_CMD_NONE : FLUSH_CMD_SHUTDOWN));
973                }
974
975                mDeferredActions.push_back(
976                        new SimpleAction(
977                                &NuPlayer::performScanSources));
978
979                processDeferredActions();
980            } else if (what == DecoderBase::kWhatEOS) {
981                int32_t err;
982                CHECK(msg->findInt32("err", &err));
983
984                if (err == ERROR_END_OF_STREAM) {
985                    ALOGV("got %s decoder EOS", audio ? "audio" : "video");
986                } else {
987                    ALOGV("got %s decoder EOS w/ error %d",
988                         audio ? "audio" : "video",
989                         err);
990                }
991
992                mRenderer->queueEOS(audio, err);
993            } else if (what == DecoderBase::kWhatFlushCompleted) {
994                ALOGV("decoder %s flush completed", audio ? "audio" : "video");
995
996                handleFlushComplete(audio, true /* isDecoder */);
997                finishFlushIfPossible();
998            } else if (what == DecoderBase::kWhatVideoSizeChanged) {
999                sp<AMessage> format;
1000                CHECK(msg->findMessage("format", &format));
1001
1002                sp<AMessage> inputFormat =
1003                        mSource->getFormat(false /* audio */);
1004
1005                setVideoScalingMode(mVideoScalingMode);
1006                updateVideoSize(inputFormat, format);
1007            } else if (what == DecoderBase::kWhatShutdownCompleted) {
1008                ALOGV("%s shutdown completed", audio ? "audio" : "video");
1009                if (audio) {
1010                    mAudioDecoder.clear();
1011                    ++mAudioDecoderGeneration;
1012
1013                    CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER);
1014                    mFlushingAudio = SHUT_DOWN;
1015                } else {
1016                    mVideoDecoder.clear();
1017                    ++mVideoDecoderGeneration;
1018
1019                    CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER);
1020                    mFlushingVideo = SHUT_DOWN;
1021                }
1022
1023                finishFlushIfPossible();
1024            } else if (what == DecoderBase::kWhatResumeCompleted) {
1025                finishResume();
1026            } else if (what == DecoderBase::kWhatError) {
1027                status_t err;
1028                if (!msg->findInt32("err", &err) || err == OK) {
1029                    err = UNKNOWN_ERROR;
1030                }
1031
1032                // Decoder errors can be due to Source (e.g. from streaming),
1033                // or from decoding corrupted bitstreams, or from other decoder
1034                // MediaCodec operations (e.g. from an ongoing reset or seek).
1035                // They may also be due to openAudioSink failure at
1036                // decoder start or after a format change.
1037                //
1038                // We try to gracefully shut down the affected decoder if possible,
1039                // rather than trying to force the shutdown with something
1040                // similar to performReset(). This method can lead to a hang
1041                // if MediaCodec functions block after an error, but they should
1042                // typically return INVALID_OPERATION instead of blocking.
1043
1044                FlushStatus *flushing = audio ? &mFlushingAudio : &mFlushingVideo;
1045                ALOGE("received error(%#x) from %s decoder, flushing(%d), now shutting down",
1046                        err, audio ? "audio" : "video", *flushing);
1047
1048                switch (*flushing) {
1049                    case NONE:
1050                        mDeferredActions.push_back(
1051                                new FlushDecoderAction(
1052                                    audio ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE,
1053                                    audio ? FLUSH_CMD_NONE : FLUSH_CMD_SHUTDOWN));
1054                        processDeferredActions();
1055                        break;
1056                    case FLUSHING_DECODER:
1057                        *flushing = FLUSHING_DECODER_SHUTDOWN; // initiate shutdown after flush.
1058                        break; // Wait for flush to complete.
1059                    case FLUSHING_DECODER_SHUTDOWN:
1060                        break; // Wait for flush to complete.
1061                    case SHUTTING_DOWN_DECODER:
1062                        break; // Wait for shutdown to complete.
1063                    case FLUSHED:
1064                        // Widevine source reads must stop before releasing the video decoder.
1065                        if (!audio && mSource != NULL && mSourceFlags & Source::FLAG_SECURE) {
1066                            mSource->stop();
1067                            mSourceStarted = false;
1068                        }
1069                        getDecoder(audio)->initiateShutdown(); // In the middle of a seek.
1070                        *flushing = SHUTTING_DOWN_DECODER;     // Shut down.
1071                        break;
1072                    case SHUT_DOWN:
1073                        finishFlushIfPossible();  // Should not occur.
1074                        break;                    // Finish anyways.
1075                }
1076                notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
1077            } else {
1078                ALOGV("Unhandled decoder notification %d '%c%c%c%c'.",
1079                      what,
1080                      what >> 24,
1081                      (what >> 16) & 0xff,
1082                      (what >> 8) & 0xff,
1083                      what & 0xff);
1084            }
1085
1086            break;
1087        }
1088
1089        case kWhatRendererNotify:
1090        {
1091            int32_t requesterGeneration = mRendererGeneration - 1;
1092            CHECK(msg->findInt32("generation", &requesterGeneration));
1093            if (requesterGeneration != mRendererGeneration) {
1094                ALOGV("got message from old renderer, generation(%d:%d)",
1095                        requesterGeneration, mRendererGeneration);
1096                return;
1097            }
1098
1099            int32_t what;
1100            CHECK(msg->findInt32("what", &what));
1101
1102            if (what == Renderer::kWhatEOS) {
1103                int32_t audio;
1104                CHECK(msg->findInt32("audio", &audio));
1105
1106                int32_t finalResult;
1107                CHECK(msg->findInt32("finalResult", &finalResult));
1108
1109                if (audio) {
1110                    mAudioEOS = true;
1111                } else {
1112                    mVideoEOS = true;
1113                }
1114
1115                if (finalResult == ERROR_END_OF_STREAM) {
1116                    ALOGV("reached %s EOS", audio ? "audio" : "video");
1117                } else {
1118                    ALOGE("%s track encountered an error (%d)",
1119                         audio ? "audio" : "video", finalResult);
1120
1121                    notifyListener(
1122                            MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult);
1123                }
1124
1125                if ((mAudioEOS || mAudioDecoder == NULL)
1126                        && (mVideoEOS || mVideoDecoder == NULL)) {
1127                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
1128                }
1129            } else if (what == Renderer::kWhatFlushComplete) {
1130                int32_t audio;
1131                CHECK(msg->findInt32("audio", &audio));
1132
1133                if (audio) {
1134                    mAudioEOS = false;
1135                } else {
1136                    mVideoEOS = false;
1137                }
1138
1139                ALOGV("renderer %s flush completed.", audio ? "audio" : "video");
1140                if (audio && (mFlushingAudio == NONE || mFlushingAudio == FLUSHED
1141                        || mFlushingAudio == SHUT_DOWN)) {
1142                    // Flush has been handled by tear down.
1143                    break;
1144                }
1145                handleFlushComplete(audio, false /* isDecoder */);
1146                finishFlushIfPossible();
1147            } else if (what == Renderer::kWhatVideoRenderingStart) {
1148                notifyListener(MEDIA_INFO, MEDIA_INFO_RENDERING_START, 0);
1149            } else if (what == Renderer::kWhatMediaRenderingStart) {
1150                ALOGV("media rendering started");
1151                notifyListener(MEDIA_STARTED, 0, 0);
1152            } else if (what == Renderer::kWhatAudioTearDown) {
1153                int32_t reason;
1154                CHECK(msg->findInt32("reason", &reason));
1155                ALOGV("Tear down audio with reason %d.", reason);
1156                if (reason == Renderer::kDueToTimeout && !(mPaused && mOffloadAudio)) {
1157                    // TimeoutWhenPaused is only for offload mode.
1158                    ALOGW("Receive a stale message for teardown.");
1159                    break;
1160                }
1161                int64_t positionUs;
1162                if (!msg->findInt64("positionUs", &positionUs)) {
1163                    positionUs = mPreviousSeekTimeUs;
1164                }
1165
1166                restartAudio(
1167                        positionUs, reason == Renderer::kForceNonOffload /* forceNonOffload */,
1168                        reason != Renderer::kDueToTimeout /* needsToCreateAudioDecoder */);
1169            }
1170            break;
1171        }
1172
1173        case kWhatMoreDataQueued:
1174        {
1175            break;
1176        }
1177
1178        case kWhatReset:
1179        {
1180            ALOGV("kWhatReset");
1181
1182            mResetting = true;
1183
1184            mDeferredActions.push_back(
1185                    new FlushDecoderAction(
1186                        FLUSH_CMD_SHUTDOWN /* audio */,
1187                        FLUSH_CMD_SHUTDOWN /* video */));
1188
1189            mDeferredActions.push_back(
1190                    new SimpleAction(&NuPlayer::performReset));
1191
1192            processDeferredActions();
1193            break;
1194        }
1195
1196        case kWhatSeek:
1197        {
1198            int64_t seekTimeUs;
1199            int32_t needNotify;
1200            CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
1201            CHECK(msg->findInt32("needNotify", &needNotify));
1202
1203            ALOGV("kWhatSeek seekTimeUs=%lld us, needNotify=%d",
1204                    (long long)seekTimeUs, needNotify);
1205
1206            if (!mStarted) {
1207                // Seek before the player is started. In order to preview video,
1208                // need to start the player and pause it. This branch is called
1209                // only once if needed. After the player is started, any seek
1210                // operation will go through normal path.
1211                // Audio-only cases are handled separately.
1212                onStart(seekTimeUs);
1213                if (mStarted) {
1214                    onPause();
1215                    mPausedByClient = true;
1216                }
1217                if (needNotify) {
1218                    notifyDriverSeekComplete();
1219                }
1220                break;
1221            }
1222
1223            mDeferredActions.push_back(
1224                    new FlushDecoderAction(FLUSH_CMD_FLUSH /* audio */,
1225                                           FLUSH_CMD_FLUSH /* video */));
1226
1227            mDeferredActions.push_back(
1228                    new SeekAction(seekTimeUs));
1229
1230            // After a flush without shutdown, decoder is paused.
1231            // Don't resume it until source seek is done, otherwise it could
1232            // start pulling stale data too soon.
1233            mDeferredActions.push_back(
1234                    new ResumeDecoderAction(needNotify));
1235
1236            processDeferredActions();
1237            break;
1238        }
1239
1240        case kWhatPause:
1241        {
1242            onPause();
1243            mPausedByClient = true;
1244            break;
1245        }
1246
1247        case kWhatSourceNotify:
1248        {
1249            onSourceNotify(msg);
1250            break;
1251        }
1252
1253        case kWhatClosedCaptionNotify:
1254        {
1255            onClosedCaptionNotify(msg);
1256            break;
1257        }
1258
1259        default:
1260            TRESPASS();
1261            break;
1262    }
1263}
1264
1265void NuPlayer::onResume() {
1266    if (!mPaused || mResetting) {
1267        ALOGD_IF(mResetting, "resetting, onResume discarded");
1268        return;
1269    }
1270    mPaused = false;
1271    if (mSource != NULL) {
1272        mSource->resume();
1273    } else {
1274        ALOGW("resume called when source is gone or not set");
1275    }
1276    // |mAudioDecoder| may have been released due to the pause timeout, so re-create it if
1277    // needed.
1278    if (audioDecoderStillNeeded() && mAudioDecoder == NULL) {
1279        instantiateDecoder(true /* audio */, &mAudioDecoder);
1280    }
1281    if (mRenderer != NULL) {
1282        mRenderer->resume();
1283    } else {
1284        ALOGW("resume called when renderer is gone or not set");
1285    }
1286}
1287
1288status_t NuPlayer::onInstantiateSecureDecoders() {
1289    status_t err;
1290    if (!(mSourceFlags & Source::FLAG_SECURE)) {
1291        return BAD_TYPE;
1292    }
1293
1294    if (mRenderer != NULL) {
1295        ALOGE("renderer should not be set when instantiating secure decoders");
1296        return UNKNOWN_ERROR;
1297    }
1298
1299    // TRICKY: We rely on mRenderer being null, so that decoder does not start requesting
1300    // data on instantiation.
1301    if (mSurface != NULL) {
1302        err = instantiateDecoder(false, &mVideoDecoder);
1303        if (err != OK) {
1304            return err;
1305        }
1306    }
1307
1308    if (mAudioSink != NULL) {
1309        err = instantiateDecoder(true, &mAudioDecoder);
1310        if (err != OK) {
1311            return err;
1312        }
1313    }
1314    return OK;
1315}
1316
1317void NuPlayer::onStart(int64_t startPositionUs) {
1318    if (!mSourceStarted) {
1319        mSourceStarted = true;
1320        mSource->start();
1321    }
1322    if (startPositionUs > 0) {
1323        performSeek(startPositionUs);
1324        if (mSource->getFormat(false /* audio */) == NULL) {
1325            return;
1326        }
1327    }
1328
1329    mOffloadAudio = false;
1330    mAudioEOS = false;
1331    mVideoEOS = false;
1332    mStarted = true;
1333    mPaused = false;
1334
1335    uint32_t flags = 0;
1336
1337    if (mSource->isRealTime()) {
1338        flags |= Renderer::FLAG_REAL_TIME;
1339    }
1340
1341    sp<MetaData> audioMeta = mSource->getFormatMeta(true /* audio */);
1342    sp<MetaData> videoMeta = mSource->getFormatMeta(false /* audio */);
1343    if (audioMeta == NULL && videoMeta == NULL) {
1344        ALOGE("no metadata for either audio or video source");
1345        mSource->stop();
1346        mSourceStarted = false;
1347        notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_MALFORMED);
1348        return;
1349    }
1350    ALOGV_IF(audioMeta == NULL, "no metadata for audio source");  // video only stream
1351
1352    audio_stream_type_t streamType = AUDIO_STREAM_MUSIC;
1353    if (mAudioSink != NULL) {
1354        streamType = mAudioSink->getAudioStreamType();
1355    }
1356
1357    sp<AMessage> videoFormat = mSource->getFormat(false /* audio */);
1358
1359    mOffloadAudio =
1360        canOffloadStream(audioMeta, (videoFormat != NULL), mSource->isStreaming(), streamType)
1361                && (mPlaybackSettings.mSpeed == 1.f && mPlaybackSettings.mPitch == 1.f);
1362    if (mOffloadAudio) {
1363        flags |= Renderer::FLAG_OFFLOAD_AUDIO;
1364    }
1365
1366    sp<AMessage> notify = new AMessage(kWhatRendererNotify, this);
1367    ++mRendererGeneration;
1368    notify->setInt32("generation", mRendererGeneration);
1369    mRenderer = new Renderer(mAudioSink, notify, flags);
1370    mRendererLooper = new ALooper;
1371    mRendererLooper->setName("NuPlayerRenderer");
1372    mRendererLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
1373    mRendererLooper->registerHandler(mRenderer);
1374
1375    status_t err = mRenderer->setPlaybackSettings(mPlaybackSettings);
1376    if (err != OK) {
1377        mSource->stop();
1378        mSourceStarted = false;
1379        notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
1380        return;
1381    }
1382
1383    float rate = getFrameRate();
1384    if (rate > 0) {
1385        mRenderer->setVideoFrameRate(rate);
1386    }
1387
1388    if (mVideoDecoder != NULL) {
1389        mVideoDecoder->setRenderer(mRenderer);
1390    }
1391    if (mAudioDecoder != NULL) {
1392        mAudioDecoder->setRenderer(mRenderer);
1393    }
1394
1395    postScanSources();
1396}
1397
1398void NuPlayer::onPause() {
1399    if (mPaused) {
1400        return;
1401    }
1402    mPaused = true;
1403    if (mSource != NULL) {
1404        mSource->pause();
1405    } else {
1406        ALOGW("pause called when source is gone or not set");
1407    }
1408    if (mRenderer != NULL) {
1409        mRenderer->pause();
1410    } else {
1411        ALOGW("pause called when renderer is gone or not set");
1412    }
1413}
1414
1415bool NuPlayer::audioDecoderStillNeeded() {
1416    // Audio decoder is no longer needed if it's in shut/shutting down status.
1417    return ((mFlushingAudio != SHUT_DOWN) && (mFlushingAudio != SHUTTING_DOWN_DECODER));
1418}
1419
1420void NuPlayer::handleFlushComplete(bool audio, bool isDecoder) {
1421    // We wait for both the decoder flush and the renderer flush to complete
1422    // before entering either the FLUSHED or the SHUTTING_DOWN_DECODER state.
1423
1424    mFlushComplete[audio][isDecoder] = true;
1425    if (!mFlushComplete[audio][!isDecoder]) {
1426        return;
1427    }
1428
1429    FlushStatus *state = audio ? &mFlushingAudio : &mFlushingVideo;
1430    switch (*state) {
1431        case FLUSHING_DECODER:
1432        {
1433            *state = FLUSHED;
1434            break;
1435        }
1436
1437        case FLUSHING_DECODER_SHUTDOWN:
1438        {
1439            *state = SHUTTING_DOWN_DECODER;
1440
1441            ALOGV("initiating %s decoder shutdown", audio ? "audio" : "video");
1442            if (!audio) {
1443                // Widevine source reads must stop before releasing the video decoder.
1444                if (mSource != NULL && mSourceFlags & Source::FLAG_SECURE) {
1445                    mSource->stop();
1446                    mSourceStarted = false;
1447                }
1448            }
1449            getDecoder(audio)->initiateShutdown();
1450            break;
1451        }
1452
1453        default:
1454            // decoder flush completes only occur in a flushing state.
1455            LOG_ALWAYS_FATAL_IF(isDecoder, "decoder flush in invalid state %d", *state);
1456            break;
1457    }
1458}
1459
1460void NuPlayer::finishFlushIfPossible() {
1461    if (mFlushingAudio != NONE && mFlushingAudio != FLUSHED
1462            && mFlushingAudio != SHUT_DOWN) {
1463        return;
1464    }
1465
1466    if (mFlushingVideo != NONE && mFlushingVideo != FLUSHED
1467            && mFlushingVideo != SHUT_DOWN) {
1468        return;
1469    }
1470
1471    ALOGV("both audio and video are flushed now.");
1472
1473    mFlushingAudio = NONE;
1474    mFlushingVideo = NONE;
1475
1476    clearFlushComplete();
1477
1478    processDeferredActions();
1479}
1480
1481void NuPlayer::postScanSources() {
1482    if (mScanSourcesPending) {
1483        return;
1484    }
1485
1486    sp<AMessage> msg = new AMessage(kWhatScanSources, this);
1487    msg->setInt32("generation", mScanSourcesGeneration);
1488    msg->post();
1489
1490    mScanSourcesPending = true;
1491}
1492
1493void NuPlayer::tryOpenAudioSinkForOffload(
1494        const sp<AMessage> &format, const sp<MetaData> &audioMeta, bool hasVideo) {
1495    // Note: This is called early in NuPlayer to determine whether offloading
1496    // is possible; otherwise the decoders call the renderer openAudioSink directly.
1497
1498    status_t err = mRenderer->openAudioSink(
1499            format, true /* offloadOnly */, hasVideo, AUDIO_OUTPUT_FLAG_NONE, &mOffloadAudio);
1500    if (err != OK) {
1501        // Any failure we turn off mOffloadAudio.
1502        mOffloadAudio = false;
1503    } else if (mOffloadAudio) {
1504        sendMetaDataToHal(mAudioSink, audioMeta);
1505    }
1506}
1507
1508void NuPlayer::closeAudioSink() {
1509    mRenderer->closeAudioSink();
1510}
1511
1512void NuPlayer::restartAudio(
1513        int64_t currentPositionUs, bool forceNonOffload, bool needsToCreateAudioDecoder) {
1514    if (mAudioDecoder != NULL) {
1515        mAudioDecoder->pause();
1516        mAudioDecoder.clear();
1517        ++mAudioDecoderGeneration;
1518    }
1519    if (mFlushingAudio == FLUSHING_DECODER) {
1520        mFlushComplete[1 /* audio */][1 /* isDecoder */] = true;
1521        mFlushingAudio = FLUSHED;
1522        finishFlushIfPossible();
1523    } else if (mFlushingAudio == FLUSHING_DECODER_SHUTDOWN
1524            || mFlushingAudio == SHUTTING_DOWN_DECODER) {
1525        mFlushComplete[1 /* audio */][1 /* isDecoder */] = true;
1526        mFlushingAudio = SHUT_DOWN;
1527        finishFlushIfPossible();
1528        needsToCreateAudioDecoder = false;
1529    }
1530    if (mRenderer == NULL) {
1531        return;
1532    }
1533    closeAudioSink();
1534    mRenderer->flush(true /* audio */, false /* notifyComplete */);
1535    if (mVideoDecoder != NULL) {
1536        mRenderer->flush(false /* audio */, false /* notifyComplete */);
1537    }
1538
1539    performSeek(currentPositionUs);
1540
1541    if (forceNonOffload) {
1542        mRenderer->signalDisableOffloadAudio();
1543        mOffloadAudio = false;
1544    }
1545    if (needsToCreateAudioDecoder) {
1546        instantiateDecoder(true /* audio */, &mAudioDecoder, !forceNonOffload);
1547    }
1548}
1549
1550void NuPlayer::determineAudioModeChange(const sp<AMessage> &audioFormat) {
1551    if (mSource == NULL || mAudioSink == NULL) {
1552        return;
1553    }
1554
1555    if (mRenderer == NULL) {
1556        ALOGW("No renderer can be used to determine audio mode. Use non-offload for safety.");
1557        mOffloadAudio = false;
1558        return;
1559    }
1560
1561    sp<MetaData> audioMeta = mSource->getFormatMeta(true /* audio */);
1562    sp<AMessage> videoFormat = mSource->getFormat(false /* audio */);
1563    audio_stream_type_t streamType = mAudioSink->getAudioStreamType();
1564    const bool hasVideo = (videoFormat != NULL);
1565    const bool canOffload = canOffloadStream(
1566            audioMeta, hasVideo, mSource->isStreaming(), streamType)
1567                    && (mPlaybackSettings.mSpeed == 1.f && mPlaybackSettings.mPitch == 1.f);
1568    if (canOffload) {
1569        if (!mOffloadAudio) {
1570            mRenderer->signalEnableOffloadAudio();
1571        }
1572        // open audio sink early under offload mode.
1573        tryOpenAudioSinkForOffload(audioFormat, audioMeta, hasVideo);
1574    } else {
1575        if (mOffloadAudio) {
1576            mRenderer->signalDisableOffloadAudio();
1577            mOffloadAudio = false;
1578        }
1579    }
1580}
1581
1582status_t NuPlayer::instantiateDecoder(
1583        bool audio, sp<DecoderBase> *decoder, bool checkAudioModeChange) {
1584    // The audio decoder could be cleared by tear down. If still in shut down
1585    // process, no need to create a new audio decoder.
1586    if (*decoder != NULL || (audio && mFlushingAudio == SHUT_DOWN)) {
1587        return OK;
1588    }
1589
1590    sp<AMessage> format = mSource->getFormat(audio);
1591
1592    if (format == NULL) {
1593        return UNKNOWN_ERROR;
1594    } else {
1595        status_t err;
1596        if (format->findInt32("err", &err) && err) {
1597            return err;
1598        }
1599    }
1600
1601    format->setInt32("priority", 0 /* realtime */);
1602
1603    if (!audio) {
1604        AString mime;
1605        CHECK(format->findString("mime", &mime));
1606
1607        sp<AMessage> ccNotify = new AMessage(kWhatClosedCaptionNotify, this);
1608        if (mCCDecoder == NULL) {
1609            mCCDecoder = new CCDecoder(ccNotify);
1610        }
1611
1612        if (mSourceFlags & Source::FLAG_SECURE) {
1613            format->setInt32("secure", true);
1614        }
1615
1616        if (mSourceFlags & Source::FLAG_PROTECTED) {
1617            format->setInt32("protected", true);
1618        }
1619
1620        float rate = getFrameRate();
1621        if (rate > 0) {
1622            format->setFloat("operating-rate", rate * mPlaybackSettings.mSpeed);
1623        }
1624    }
1625
1626    if (audio) {
1627        sp<AMessage> notify = new AMessage(kWhatAudioNotify, this);
1628        ++mAudioDecoderGeneration;
1629        notify->setInt32("generation", mAudioDecoderGeneration);
1630
1631        if (checkAudioModeChange) {
1632            determineAudioModeChange(format);
1633        }
1634        if (mOffloadAudio) {
1635            mSource->setOffloadAudio(true /* offload */);
1636
1637            const bool hasVideo = (mSource->getFormat(false /*audio */) != NULL);
1638            format->setInt32("has-video", hasVideo);
1639            *decoder = new DecoderPassThrough(notify, mSource, mRenderer);
1640        } else {
1641            mSource->setOffloadAudio(false /* offload */);
1642
1643            *decoder = new Decoder(notify, mSource, mPID, mRenderer);
1644        }
1645    } else {
1646        sp<AMessage> notify = new AMessage(kWhatVideoNotify, this);
1647        ++mVideoDecoderGeneration;
1648        notify->setInt32("generation", mVideoDecoderGeneration);
1649
1650        *decoder = new Decoder(
1651                notify, mSource, mPID, mRenderer, mSurface, mCCDecoder);
1652
1653        // enable FRC if high-quality AV sync is requested, even if not
1654        // directly queuing to display, as this will even improve textureview
1655        // playback.
1656        {
1657            char value[PROPERTY_VALUE_MAX];
1658            if (property_get("persist.sys.media.avsync", value, NULL) &&
1659                    (!strcmp("1", value) || !strcasecmp("true", value))) {
1660                format->setInt32("auto-frc", 1);
1661            }
1662        }
1663    }
1664    (*decoder)->init();
1665    (*decoder)->configure(format);
1666
1667    // allocate buffers to decrypt widevine source buffers
1668    if (!audio && (mSourceFlags & Source::FLAG_SECURE)) {
1669        Vector<sp<ABuffer> > inputBufs;
1670        CHECK_EQ((*decoder)->getInputBuffers(&inputBufs), (status_t)OK);
1671
1672        Vector<MediaBuffer *> mediaBufs;
1673        for (size_t i = 0; i < inputBufs.size(); i++) {
1674            const sp<ABuffer> &buffer = inputBufs[i];
1675            MediaBuffer *mbuf = new MediaBuffer(buffer->data(), buffer->size());
1676            mediaBufs.push(mbuf);
1677        }
1678
1679        status_t err = mSource->setBuffers(audio, mediaBufs);
1680        if (err != OK) {
1681            for (size_t i = 0; i < mediaBufs.size(); ++i) {
1682                mediaBufs[i]->release();
1683            }
1684            mediaBufs.clear();
1685            ALOGE("Secure source didn't support secure mediaBufs.");
1686            return err;
1687        }
1688    }
1689
1690    if (!audio) {
1691        sp<AMessage> params = new AMessage();
1692        float rate = getFrameRate();
1693        if (rate > 0) {
1694            params->setFloat("frame-rate-total", rate);
1695        }
1696
1697        sp<MetaData> fileMeta = getFileMeta();
1698        if (fileMeta != NULL) {
1699            int32_t videoTemporalLayerCount;
1700            if (fileMeta->findInt32(kKeyTemporalLayerCount, &videoTemporalLayerCount)
1701                    && videoTemporalLayerCount > 0) {
1702                params->setInt32("temporal-layer-count", videoTemporalLayerCount);
1703            }
1704        }
1705
1706        if (params->countEntries() > 0) {
1707            (*decoder)->setParameters(params);
1708        }
1709    }
1710    return OK;
1711}
1712
1713void NuPlayer::updateVideoSize(
1714        const sp<AMessage> &inputFormat,
1715        const sp<AMessage> &outputFormat) {
1716    if (inputFormat == NULL) {
1717        ALOGW("Unknown video size, reporting 0x0!");
1718        notifyListener(MEDIA_SET_VIDEO_SIZE, 0, 0);
1719        return;
1720    }
1721
1722    int32_t displayWidth, displayHeight;
1723    if (outputFormat != NULL) {
1724        int32_t width, height;
1725        CHECK(outputFormat->findInt32("width", &width));
1726        CHECK(outputFormat->findInt32("height", &height));
1727
1728        int32_t cropLeft, cropTop, cropRight, cropBottom;
1729        CHECK(outputFormat->findRect(
1730                    "crop",
1731                    &cropLeft, &cropTop, &cropRight, &cropBottom));
1732
1733        displayWidth = cropRight - cropLeft + 1;
1734        displayHeight = cropBottom - cropTop + 1;
1735
1736        ALOGV("Video output format changed to %d x %d "
1737             "(crop: %d x %d @ (%d, %d))",
1738             width, height,
1739             displayWidth,
1740             displayHeight,
1741             cropLeft, cropTop);
1742    } else {
1743        CHECK(inputFormat->findInt32("width", &displayWidth));
1744        CHECK(inputFormat->findInt32("height", &displayHeight));
1745
1746        ALOGV("Video input format %d x %d", displayWidth, displayHeight);
1747    }
1748
1749    // Take into account sample aspect ratio if necessary:
1750    int32_t sarWidth, sarHeight;
1751    if (inputFormat->findInt32("sar-width", &sarWidth)
1752            && inputFormat->findInt32("sar-height", &sarHeight)) {
1753        ALOGV("Sample aspect ratio %d : %d", sarWidth, sarHeight);
1754
1755        displayWidth = (displayWidth * sarWidth) / sarHeight;
1756
1757        ALOGV("display dimensions %d x %d", displayWidth, displayHeight);
1758    }
1759
1760    int32_t rotationDegrees;
1761    if (!inputFormat->findInt32("rotation-degrees", &rotationDegrees)) {
1762        rotationDegrees = 0;
1763    }
1764
1765    if (rotationDegrees == 90 || rotationDegrees == 270) {
1766        int32_t tmp = displayWidth;
1767        displayWidth = displayHeight;
1768        displayHeight = tmp;
1769    }
1770
1771    notifyListener(
1772            MEDIA_SET_VIDEO_SIZE,
1773            displayWidth,
1774            displayHeight);
1775}
1776
1777void NuPlayer::notifyListener(int msg, int ext1, int ext2, const Parcel *in) {
1778    if (mDriver == NULL) {
1779        return;
1780    }
1781
1782    sp<NuPlayerDriver> driver = mDriver.promote();
1783
1784    if (driver == NULL) {
1785        return;
1786    }
1787
1788    driver->notifyListener(msg, ext1, ext2, in);
1789}
1790
1791void NuPlayer::flushDecoder(bool audio, bool needShutdown) {
1792    ALOGV("[%s] flushDecoder needShutdown=%d",
1793          audio ? "audio" : "video", needShutdown);
1794
1795    const sp<DecoderBase> &decoder = getDecoder(audio);
1796    if (decoder == NULL) {
1797        ALOGI("flushDecoder %s without decoder present",
1798             audio ? "audio" : "video");
1799        return;
1800    }
1801
1802    // Make sure we don't continue to scan sources until we finish flushing.
1803    ++mScanSourcesGeneration;
1804    if (mScanSourcesPending) {
1805        mDeferredActions.push_back(
1806                new SimpleAction(&NuPlayer::performScanSources));
1807        mScanSourcesPending = false;
1808    }
1809
1810    decoder->signalFlush();
1811
1812    FlushStatus newStatus =
1813        needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER;
1814
1815    mFlushComplete[audio][false /* isDecoder */] = (mRenderer == NULL);
1816    mFlushComplete[audio][true /* isDecoder */] = false;
1817    if (audio) {
1818        ALOGE_IF(mFlushingAudio != NONE,
1819                "audio flushDecoder() is called in state %d", mFlushingAudio);
1820        mFlushingAudio = newStatus;
1821    } else {
1822        ALOGE_IF(mFlushingVideo != NONE,
1823                "video flushDecoder() is called in state %d", mFlushingVideo);
1824        mFlushingVideo = newStatus;
1825    }
1826}
1827
1828void NuPlayer::queueDecoderShutdown(
1829        bool audio, bool video, const sp<AMessage> &reply) {
1830    ALOGI("queueDecoderShutdown audio=%d, video=%d", audio, video);
1831
1832    mDeferredActions.push_back(
1833            new FlushDecoderAction(
1834                audio ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE,
1835                video ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE));
1836
1837    mDeferredActions.push_back(
1838            new SimpleAction(&NuPlayer::performScanSources));
1839
1840    mDeferredActions.push_back(new PostMessageAction(reply));
1841
1842    processDeferredActions();
1843}
1844
1845status_t NuPlayer::setVideoScalingMode(int32_t mode) {
1846    mVideoScalingMode = mode;
1847    if (mSurface != NULL) {
1848        status_t ret = native_window_set_scaling_mode(mSurface.get(), mVideoScalingMode);
1849        if (ret != OK) {
1850            ALOGE("Failed to set scaling mode (%d): %s",
1851                -ret, strerror(-ret));
1852            return ret;
1853        }
1854    }
1855    return OK;
1856}
1857
1858status_t NuPlayer::getTrackInfo(Parcel* reply) const {
1859    sp<AMessage> msg = new AMessage(kWhatGetTrackInfo, this);
1860    msg->setPointer("reply", reply);
1861
1862    sp<AMessage> response;
1863    status_t err = msg->postAndAwaitResponse(&response);
1864    return err;
1865}
1866
1867status_t NuPlayer::getSelectedTrack(int32_t type, Parcel* reply) const {
1868    sp<AMessage> msg = new AMessage(kWhatGetSelectedTrack, this);
1869    msg->setPointer("reply", reply);
1870    msg->setInt32("type", type);
1871
1872    sp<AMessage> response;
1873    status_t err = msg->postAndAwaitResponse(&response);
1874    if (err == OK && response != NULL) {
1875        CHECK(response->findInt32("err", &err));
1876    }
1877    return err;
1878}
1879
1880status_t NuPlayer::selectTrack(size_t trackIndex, bool select, int64_t timeUs) {
1881    sp<AMessage> msg = new AMessage(kWhatSelectTrack, this);
1882    msg->setSize("trackIndex", trackIndex);
1883    msg->setInt32("select", select);
1884    msg->setInt64("timeUs", timeUs);
1885
1886    sp<AMessage> response;
1887    status_t err = msg->postAndAwaitResponse(&response);
1888
1889    if (err != OK) {
1890        return err;
1891    }
1892
1893    if (!response->findInt32("err", &err)) {
1894        err = OK;
1895    }
1896
1897    return err;
1898}
1899
1900status_t NuPlayer::getCurrentPosition(int64_t *mediaUs) {
1901    sp<Renderer> renderer = mRenderer;
1902    if (renderer == NULL) {
1903        return NO_INIT;
1904    }
1905
1906    return renderer->getCurrentPosition(mediaUs);
1907}
1908
1909void NuPlayer::getStats(Vector<sp<AMessage> > *mTrackStats) {
1910    CHECK(mTrackStats != NULL);
1911
1912    mTrackStats->clear();
1913    if (mVideoDecoder != NULL) {
1914        mTrackStats->push_back(mVideoDecoder->getStats());
1915    }
1916    if (mAudioDecoder != NULL) {
1917        mTrackStats->push_back(mAudioDecoder->getStats());
1918    }
1919}
1920
1921sp<MetaData> NuPlayer::getFileMeta() {
1922    return mSource->getFileFormatMeta();
1923}
1924
1925float NuPlayer::getFrameRate() {
1926    sp<MetaData> meta = mSource->getFormatMeta(false /* audio */);
1927    if (meta == NULL) {
1928        return 0;
1929    }
1930    int32_t rate;
1931    if (!meta->findInt32(kKeyFrameRate, &rate)) {
1932        // fall back to try file meta
1933        sp<MetaData> fileMeta = getFileMeta();
1934        if (fileMeta == NULL) {
1935            ALOGW("source has video meta but not file meta");
1936            return -1;
1937        }
1938        int32_t fileMetaRate;
1939        if (!fileMeta->findInt32(kKeyFrameRate, &fileMetaRate)) {
1940            return -1;
1941        }
1942        return fileMetaRate;
1943    }
1944    return rate;
1945}
1946
1947void NuPlayer::schedulePollDuration() {
1948    sp<AMessage> msg = new AMessage(kWhatPollDuration, this);
1949    msg->setInt32("generation", mPollDurationGeneration);
1950    msg->post();
1951}
1952
1953void NuPlayer::cancelPollDuration() {
1954    ++mPollDurationGeneration;
1955}
1956
1957void NuPlayer::processDeferredActions() {
1958    while (!mDeferredActions.empty()) {
1959        // We won't execute any deferred actions until we're no longer in
1960        // an intermediate state, i.e. one more more decoders are currently
1961        // flushing or shutting down.
1962
1963        if (mFlushingAudio != NONE || mFlushingVideo != NONE) {
1964            // We're currently flushing, postpone the reset until that's
1965            // completed.
1966
1967            ALOGV("postponing action mFlushingAudio=%d, mFlushingVideo=%d",
1968                  mFlushingAudio, mFlushingVideo);
1969
1970            break;
1971        }
1972
1973        sp<Action> action = *mDeferredActions.begin();
1974        mDeferredActions.erase(mDeferredActions.begin());
1975
1976        action->execute(this);
1977    }
1978}
1979
1980void NuPlayer::performSeek(int64_t seekTimeUs) {
1981    ALOGV("performSeek seekTimeUs=%lld us (%.2f secs)",
1982          (long long)seekTimeUs,
1983          seekTimeUs / 1E6);
1984
1985    if (mSource == NULL) {
1986        // This happens when reset occurs right before the loop mode
1987        // asynchronously seeks to the start of the stream.
1988        LOG_ALWAYS_FATAL_IF(mAudioDecoder != NULL || mVideoDecoder != NULL,
1989                "mSource is NULL and decoders not NULL audio(%p) video(%p)",
1990                mAudioDecoder.get(), mVideoDecoder.get());
1991        return;
1992    }
1993    mPreviousSeekTimeUs = seekTimeUs;
1994    mSource->seekTo(seekTimeUs);
1995    ++mTimedTextGeneration;
1996
1997    // everything's flushed, continue playback.
1998}
1999
2000void NuPlayer::performDecoderFlush(FlushCommand audio, FlushCommand video) {
2001    ALOGV("performDecoderFlush audio=%d, video=%d", audio, video);
2002
2003    if ((audio == FLUSH_CMD_NONE || mAudioDecoder == NULL)
2004            && (video == FLUSH_CMD_NONE || mVideoDecoder == NULL)) {
2005        return;
2006    }
2007
2008    if (audio != FLUSH_CMD_NONE && mAudioDecoder != NULL) {
2009        flushDecoder(true /* audio */, (audio == FLUSH_CMD_SHUTDOWN));
2010    }
2011
2012    if (video != FLUSH_CMD_NONE && mVideoDecoder != NULL) {
2013        flushDecoder(false /* audio */, (video == FLUSH_CMD_SHUTDOWN));
2014    }
2015}
2016
2017void NuPlayer::performReset() {
2018    ALOGV("performReset");
2019
2020    CHECK(mAudioDecoder == NULL);
2021    CHECK(mVideoDecoder == NULL);
2022
2023    cancelPollDuration();
2024
2025    ++mScanSourcesGeneration;
2026    mScanSourcesPending = false;
2027
2028    if (mRendererLooper != NULL) {
2029        if (mRenderer != NULL) {
2030            mRendererLooper->unregisterHandler(mRenderer->id());
2031        }
2032        mRendererLooper->stop();
2033        mRendererLooper.clear();
2034    }
2035    mRenderer.clear();
2036    ++mRendererGeneration;
2037
2038    if (mSource != NULL) {
2039        mSource->stop();
2040
2041        Mutex::Autolock autoLock(mSourceLock);
2042        mSource.clear();
2043    }
2044
2045    if (mDriver != NULL) {
2046        sp<NuPlayerDriver> driver = mDriver.promote();
2047        if (driver != NULL) {
2048            driver->notifyResetComplete();
2049        }
2050    }
2051
2052    mStarted = false;
2053    mPrepared = false;
2054    mResetting = false;
2055    mSourceStarted = false;
2056}
2057
2058void NuPlayer::performScanSources() {
2059    ALOGV("performScanSources");
2060
2061    if (!mStarted) {
2062        return;
2063    }
2064
2065    if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
2066        postScanSources();
2067    }
2068}
2069
2070void NuPlayer::performSetSurface(const sp<Surface> &surface) {
2071    ALOGV("performSetSurface");
2072
2073    mSurface = surface;
2074
2075    // XXX - ignore error from setVideoScalingMode for now
2076    setVideoScalingMode(mVideoScalingMode);
2077
2078    if (mDriver != NULL) {
2079        sp<NuPlayerDriver> driver = mDriver.promote();
2080        if (driver != NULL) {
2081            driver->notifySetSurfaceComplete();
2082        }
2083    }
2084}
2085
2086void NuPlayer::performResumeDecoders(bool needNotify) {
2087    if (needNotify) {
2088        mResumePending = true;
2089        if (mVideoDecoder == NULL) {
2090            // if audio-only, we can notify seek complete now,
2091            // as the resume operation will be relatively fast.
2092            finishResume();
2093        }
2094    }
2095
2096    if (mVideoDecoder != NULL) {
2097        // When there is continuous seek, MediaPlayer will cache the seek
2098        // position, and send down new seek request when previous seek is
2099        // complete. Let's wait for at least one video output frame before
2100        // notifying seek complete, so that the video thumbnail gets updated
2101        // when seekbar is dragged.
2102        mVideoDecoder->signalResume(needNotify);
2103    }
2104
2105    if (mAudioDecoder != NULL) {
2106        mAudioDecoder->signalResume(false /* needNotify */);
2107    }
2108}
2109
2110void NuPlayer::finishResume() {
2111    if (mResumePending) {
2112        mResumePending = false;
2113        notifyDriverSeekComplete();
2114    }
2115}
2116
2117void NuPlayer::notifyDriverSeekComplete() {
2118    if (mDriver != NULL) {
2119        sp<NuPlayerDriver> driver = mDriver.promote();
2120        if (driver != NULL) {
2121            driver->notifySeekComplete();
2122        }
2123    }
2124}
2125
2126void NuPlayer::onSourceNotify(const sp<AMessage> &msg) {
2127    int32_t what;
2128    CHECK(msg->findInt32("what", &what));
2129
2130    switch (what) {
2131        case Source::kWhatInstantiateSecureDecoders:
2132        {
2133            if (mSource == NULL) {
2134                // This is a stale notification from a source that was
2135                // asynchronously preparing when the client called reset().
2136                // We handled the reset, the source is gone.
2137                break;
2138            }
2139
2140            sp<AMessage> reply;
2141            CHECK(msg->findMessage("reply", &reply));
2142            status_t err = onInstantiateSecureDecoders();
2143            reply->setInt32("err", err);
2144            reply->post();
2145            break;
2146        }
2147
2148        case Source::kWhatPrepared:
2149        {
2150            if (mSource == NULL) {
2151                // This is a stale notification from a source that was
2152                // asynchronously preparing when the client called reset().
2153                // We handled the reset, the source is gone.
2154                break;
2155            }
2156
2157            int32_t err;
2158            CHECK(msg->findInt32("err", &err));
2159
2160            if (err != OK) {
2161                // shut down potential secure codecs in case client never calls reset
2162                mDeferredActions.push_back(
2163                        new FlushDecoderAction(FLUSH_CMD_SHUTDOWN /* audio */,
2164                                               FLUSH_CMD_SHUTDOWN /* video */));
2165                processDeferredActions();
2166            } else {
2167                mPrepared = true;
2168            }
2169
2170            sp<NuPlayerDriver> driver = mDriver.promote();
2171            if (driver != NULL) {
2172                // notify duration first, so that it's definitely set when
2173                // the app received the "prepare complete" callback.
2174                int64_t durationUs;
2175                if (mSource->getDuration(&durationUs) == OK) {
2176                    driver->notifyDuration(durationUs);
2177                }
2178                driver->notifyPrepareCompleted(err);
2179            }
2180
2181            break;
2182        }
2183
2184        case Source::kWhatFlagsChanged:
2185        {
2186            uint32_t flags;
2187            CHECK(msg->findInt32("flags", (int32_t *)&flags));
2188
2189            sp<NuPlayerDriver> driver = mDriver.promote();
2190            if (driver != NULL) {
2191                if ((flags & NuPlayer::Source::FLAG_CAN_SEEK) == 0) {
2192                    driver->notifyListener(
2193                            MEDIA_INFO, MEDIA_INFO_NOT_SEEKABLE, 0);
2194                }
2195                driver->notifyFlagsChanged(flags);
2196            }
2197
2198            if ((mSourceFlags & Source::FLAG_DYNAMIC_DURATION)
2199                    && (!(flags & Source::FLAG_DYNAMIC_DURATION))) {
2200                cancelPollDuration();
2201            } else if (!(mSourceFlags & Source::FLAG_DYNAMIC_DURATION)
2202                    && (flags & Source::FLAG_DYNAMIC_DURATION)
2203                    && (mAudioDecoder != NULL || mVideoDecoder != NULL)) {
2204                schedulePollDuration();
2205            }
2206
2207            mSourceFlags = flags;
2208            break;
2209        }
2210
2211        case Source::kWhatVideoSizeChanged:
2212        {
2213            sp<AMessage> format;
2214            CHECK(msg->findMessage("format", &format));
2215
2216            updateVideoSize(format);
2217            break;
2218        }
2219
2220        case Source::kWhatBufferingUpdate:
2221        {
2222            int32_t percentage;
2223            CHECK(msg->findInt32("percentage", &percentage));
2224
2225            notifyListener(MEDIA_BUFFERING_UPDATE, percentage, 0);
2226            break;
2227        }
2228
2229        case Source::kWhatPauseOnBufferingStart:
2230        {
2231            // ignore if not playing
2232            if (mStarted) {
2233                ALOGI("buffer low, pausing...");
2234
2235                mPausedForBuffering = true;
2236                onPause();
2237            }
2238            notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_START, 0);
2239            break;
2240        }
2241
2242        case Source::kWhatResumeOnBufferingEnd:
2243        {
2244            // ignore if not playing
2245            if (mStarted) {
2246                ALOGI("buffer ready, resuming...");
2247
2248                mPausedForBuffering = false;
2249
2250                // do not resume yet if client didn't unpause
2251                if (!mPausedByClient) {
2252                    onResume();
2253                }
2254            }
2255            notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_END, 0);
2256            break;
2257        }
2258
2259        case Source::kWhatCacheStats:
2260        {
2261            int32_t kbps;
2262            CHECK(msg->findInt32("bandwidth", &kbps));
2263
2264            notifyListener(MEDIA_INFO, MEDIA_INFO_NETWORK_BANDWIDTH, kbps);
2265            break;
2266        }
2267
2268        case Source::kWhatSubtitleData:
2269        {
2270            sp<ABuffer> buffer;
2271            CHECK(msg->findBuffer("buffer", &buffer));
2272
2273            sendSubtitleData(buffer, 0 /* baseIndex */);
2274            break;
2275        }
2276
2277        case Source::kWhatTimedMetaData:
2278        {
2279            sp<ABuffer> buffer;
2280            if (!msg->findBuffer("buffer", &buffer)) {
2281                notifyListener(MEDIA_INFO, MEDIA_INFO_METADATA_UPDATE, 0);
2282            } else {
2283                sendTimedMetaData(buffer);
2284            }
2285            break;
2286        }
2287
2288        case Source::kWhatTimedTextData:
2289        {
2290            int32_t generation;
2291            if (msg->findInt32("generation", &generation)
2292                    && generation != mTimedTextGeneration) {
2293                break;
2294            }
2295
2296            sp<ABuffer> buffer;
2297            CHECK(msg->findBuffer("buffer", &buffer));
2298
2299            sp<NuPlayerDriver> driver = mDriver.promote();
2300            if (driver == NULL) {
2301                break;
2302            }
2303
2304            int posMs;
2305            int64_t timeUs, posUs;
2306            driver->getCurrentPosition(&posMs);
2307            posUs = (int64_t) posMs * 1000ll;
2308            CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
2309
2310            if (posUs < timeUs) {
2311                if (!msg->findInt32("generation", &generation)) {
2312                    msg->setInt32("generation", mTimedTextGeneration);
2313                }
2314                msg->post(timeUs - posUs);
2315            } else {
2316                sendTimedTextData(buffer);
2317            }
2318            break;
2319        }
2320
2321        case Source::kWhatQueueDecoderShutdown:
2322        {
2323            int32_t audio, video;
2324            CHECK(msg->findInt32("audio", &audio));
2325            CHECK(msg->findInt32("video", &video));
2326
2327            sp<AMessage> reply;
2328            CHECK(msg->findMessage("reply", &reply));
2329
2330            queueDecoderShutdown(audio, video, reply);
2331            break;
2332        }
2333
2334        case Source::kWhatDrmNoLicense:
2335        {
2336            notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE);
2337            break;
2338        }
2339
2340        default:
2341            TRESPASS();
2342    }
2343}
2344
2345void NuPlayer::onClosedCaptionNotify(const sp<AMessage> &msg) {
2346    int32_t what;
2347    CHECK(msg->findInt32("what", &what));
2348
2349    switch (what) {
2350        case NuPlayer::CCDecoder::kWhatClosedCaptionData:
2351        {
2352            sp<ABuffer> buffer;
2353            CHECK(msg->findBuffer("buffer", &buffer));
2354
2355            size_t inbandTracks = 0;
2356            if (mSource != NULL) {
2357                inbandTracks = mSource->getTrackCount();
2358            }
2359
2360            sendSubtitleData(buffer, inbandTracks);
2361            break;
2362        }
2363
2364        case NuPlayer::CCDecoder::kWhatTrackAdded:
2365        {
2366            notifyListener(MEDIA_INFO, MEDIA_INFO_METADATA_UPDATE, 0);
2367
2368            break;
2369        }
2370
2371        default:
2372            TRESPASS();
2373    }
2374
2375
2376}
2377
2378void NuPlayer::sendSubtitleData(const sp<ABuffer> &buffer, int32_t baseIndex) {
2379    int32_t trackIndex;
2380    int64_t timeUs, durationUs;
2381    CHECK(buffer->meta()->findInt32("trackIndex", &trackIndex));
2382    CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
2383    CHECK(buffer->meta()->findInt64("durationUs", &durationUs));
2384
2385    Parcel in;
2386    in.writeInt32(trackIndex + baseIndex);
2387    in.writeInt64(timeUs);
2388    in.writeInt64(durationUs);
2389    in.writeInt32(buffer->size());
2390    in.writeInt32(buffer->size());
2391    in.write(buffer->data(), buffer->size());
2392
2393    notifyListener(MEDIA_SUBTITLE_DATA, 0, 0, &in);
2394}
2395
2396void NuPlayer::sendTimedMetaData(const sp<ABuffer> &buffer) {
2397    int64_t timeUs;
2398    CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
2399
2400    Parcel in;
2401    in.writeInt64(timeUs);
2402    in.writeInt32(buffer->size());
2403    in.writeInt32(buffer->size());
2404    in.write(buffer->data(), buffer->size());
2405
2406    notifyListener(MEDIA_META_DATA, 0, 0, &in);
2407}
2408
2409void NuPlayer::sendTimedTextData(const sp<ABuffer> &buffer) {
2410    const void *data;
2411    size_t size = 0;
2412    int64_t timeUs;
2413    int32_t flag = TextDescriptions::IN_BAND_TEXT_3GPP;
2414
2415    AString mime;
2416    CHECK(buffer->meta()->findString("mime", &mime));
2417    CHECK(strcasecmp(mime.c_str(), MEDIA_MIMETYPE_TEXT_3GPP) == 0);
2418
2419    data = buffer->data();
2420    size = buffer->size();
2421
2422    Parcel parcel;
2423    if (size > 0) {
2424        CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
2425        int32_t global = 0;
2426        if (buffer->meta()->findInt32("global", &global) && global) {
2427            flag |= TextDescriptions::GLOBAL_DESCRIPTIONS;
2428        } else {
2429            flag |= TextDescriptions::LOCAL_DESCRIPTIONS;
2430        }
2431        TextDescriptions::getParcelOfDescriptions(
2432                (const uint8_t *)data, size, flag, timeUs / 1000, &parcel);
2433    }
2434
2435    if ((parcel.dataSize() > 0)) {
2436        notifyListener(MEDIA_TIMED_TEXT, 0, 0, &parcel);
2437    } else {  // send an empty timed text
2438        notifyListener(MEDIA_TIMED_TEXT, 0, 0);
2439    }
2440}
2441////////////////////////////////////////////////////////////////////////////////
2442
2443sp<AMessage> NuPlayer::Source::getFormat(bool audio) {
2444    sp<MetaData> meta = getFormatMeta(audio);
2445
2446    if (meta == NULL) {
2447        return NULL;
2448    }
2449
2450    sp<AMessage> msg = new AMessage;
2451
2452    if(convertMetaDataToMessage(meta, &msg) == OK) {
2453        return msg;
2454    }
2455    return NULL;
2456}
2457
2458void NuPlayer::Source::notifyFlagsChanged(uint32_t flags) {
2459    sp<AMessage> notify = dupNotify();
2460    notify->setInt32("what", kWhatFlagsChanged);
2461    notify->setInt32("flags", flags);
2462    notify->post();
2463}
2464
2465void NuPlayer::Source::notifyVideoSizeChanged(const sp<AMessage> &format) {
2466    sp<AMessage> notify = dupNotify();
2467    notify->setInt32("what", kWhatVideoSizeChanged);
2468    notify->setMessage("format", format);
2469    notify->post();
2470}
2471
2472void NuPlayer::Source::notifyPrepared(status_t err) {
2473    sp<AMessage> notify = dupNotify();
2474    notify->setInt32("what", kWhatPrepared);
2475    notify->setInt32("err", err);
2476    notify->post();
2477}
2478
2479void NuPlayer::Source::notifyInstantiateSecureDecoders(const sp<AMessage> &reply) {
2480    sp<AMessage> notify = dupNotify();
2481    notify->setInt32("what", kWhatInstantiateSecureDecoders);
2482    notify->setMessage("reply", reply);
2483    notify->post();
2484}
2485
2486void NuPlayer::Source::onMessageReceived(const sp<AMessage> & /* msg */) {
2487    TRESPASS();
2488}
2489
2490}  // namespace android
2491