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