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