NuPlayer.cpp revision 6d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aab
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/*
2f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Copyright (C) 2010 The Android Open Source Project
3f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
4f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * you may not use this file except in compliance with the License.
6f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * You may obtain a copy of the License at
7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
8f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
10f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Unless required by applicable law or agreed to in writing, software
11f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * See the License for the specific language governing permissions and
14f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * limitations under the License.
15f933441648ef6a71dee783d733aac17b9508b452Andreas Huber */
16f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//#define LOG_NDEBUG 0
18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define LOG_TAG "NuPlayer"
19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Log.h>
20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayer.h"
225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
235bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "HTTPLiveSource.h"
24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerDecoder.h"
2543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber#include "NuPlayerDriver.h"
26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerRenderer.h"
275bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "NuPlayerSource.h"
282bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include "RTSPSource.h"
295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "StreamingSource.h"
30afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include "GenericSource.h"
315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
325bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "ATSParser.h"
33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
34da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo#include "SoftwareRenderer.h"
35da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo
363831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber#include <media/stagefright/foundation/hexdump.h>
37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h>
39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h>
40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h>
413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include <media/stagefright/MediaDefs.h>
42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h>
43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h>
448ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h>
45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include "avc_utils.h"
473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
48840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include "ESDS.h"
49840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include <media/stagefright/Utils.h>
50840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
51f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
53a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberstruct NuPlayer::Action : public RefBase {
54a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    Action() {}
55a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
56a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    virtual void execute(NuPlayer *player) = 0;
57a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
58a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberprivate:
59a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(Action);
60a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber};
61a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
62a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberstruct NuPlayer::SeekAction : public Action {
63a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    SeekAction(int64_t seekTimeUs)
64a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        : mSeekTimeUs(seekTimeUs) {
65a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
66a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
67a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    virtual void execute(NuPlayer *player) {
68a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        player->performSeek(mSeekTimeUs);
69a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
70a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
71a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberprivate:
72a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    int64_t mSeekTimeUs;
73a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
74a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(SeekAction);
75a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber};
76a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
7757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huberstruct NuPlayer::SetSurfaceAction : public Action {
7857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    SetSurfaceAction(const sp<NativeWindowWrapper> &wrapper)
7957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber        : mWrapper(wrapper) {
8057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    }
8157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
8257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    virtual void execute(NuPlayer *player) {
8357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber        player->performSetSurface(mWrapper);
8457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    }
8557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
8657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huberprivate:
8757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    sp<NativeWindowWrapper> mWrapper;
8857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
8957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(SetSurfaceAction);
9057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber};
9157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
9214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct NuPlayer::ShutdownDecoderAction : public Action {
9314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    ShutdownDecoderAction(bool audio, bool video)
9414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        : mAudio(audio),
9514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber          mVideo(video) {
9614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    }
9714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
9814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    virtual void execute(NuPlayer *player) {
9914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        player->performDecoderShutdown(mAudio, mVideo);
10014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    }
10114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
10214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprivate:
10314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    bool mAudio;
10414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    bool mVideo;
10514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
10614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(ShutdownDecoderAction);
10714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber};
10814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
10914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct NuPlayer::PostMessageAction : public Action {
11014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    PostMessageAction(const sp<AMessage> &msg)
11114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        : mMessage(msg) {
11214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    }
11314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
11414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    virtual void execute(NuPlayer *) {
11514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        mMessage->post();
11614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    }
11714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
11814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprivate:
11914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<AMessage> mMessage;
12014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
12114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(PostMessageAction);
12214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber};
12314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
124a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber// Use this if there's no state necessary to save in order to execute
125a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber// the action.
126a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberstruct NuPlayer::SimpleAction : public Action {
127a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    typedef void (NuPlayer::*ActionFunc)();
128a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
129a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    SimpleAction(ActionFunc func)
130a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        : mFunc(func) {
131a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
132a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
133a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    virtual void execute(NuPlayer *player) {
134a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        (player->*mFunc)();
135a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
136a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
137a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberprivate:
138a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    ActionFunc mFunc;
139a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
140a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(SimpleAction);
141a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber};
142a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
145f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer()
1469b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    : mUIDValid(false),
1479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber      mSourceFlags(0),
1483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mVideoIsAVC(false),
149da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo      mNeedsSwRenderer(false),
1509b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber      mAudioEOS(false),
151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mVideoEOS(false),
1525bc087c573c70c84c6a39946457590b42d392a33Andreas Huber      mScanSourcesPending(false),
1531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mScanSourcesGeneration(0),
154b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber      mPollDurationGeneration(0),
1556e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber      mTimeDiscontinuityPending(false),
156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mFlushingAudio(NONE),
1571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mFlushingVideo(NONE),
1583fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mSkipRenderingAudioUntilMediaTimeUs(-1ll),
1593fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mSkipRenderingVideoUntilMediaTimeUs(-1ll),
1603fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mVideoLateByUs(0ll),
1613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mNumFramesTotal(0ll),
1620d268a3cae145afb2720c88ae38fb81550be5584James Dong      mNumFramesDropped(0ll),
16357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber      mVideoScalingMode(NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW),
16457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber      mStarted(false) {
165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
167f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() {
168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1709b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid NuPlayer::setUID(uid_t uid) {
1719b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUIDValid = true;
1729b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUID = uid;
1739b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber}
1749b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
17543c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) {
17643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mDriver = driver;
177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1799575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::setDataSourceAsync(const sp<IStreamSource> &source) {
180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
182b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    sp<AMessage> notify = new AMessage(kWhatSourceNotify, id());
183b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
184240abcc4bf661a10ffca24859945796acc76ac6eAndreas Huber    msg->setObject("source", new StreamingSource(notify, source));
1855bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->post();
1865bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
1875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
188afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatic bool IsHTTPLiveURL(const char *url) {
189afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (!strncasecmp("http://", url, 7)
190997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber            || !strncasecmp("https://", url, 8)
191997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber            || !strncasecmp("file://", url, 7)) {
192afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        size_t len = strlen(url);
193afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) {
194afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            return true;
195afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
196afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
197afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (strstr(url,"m3u8")) {
198afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            return true;
199afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
200afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
201afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
202afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return false;
203afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
204afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
2059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::setDataSourceAsync(
2061b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const sp<IMediaHTTPService> &httpService,
2071b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const char *url,
2081b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const KeyedVector<String8, String8> *headers) {
2095bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
2107a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    size_t len = strlen(url);
211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
212b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    sp<AMessage> notify = new AMessage(kWhatSourceNotify, id());
213b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
214afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<Source> source;
215afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (IsHTTPLiveURL(url)) {
21681e68448f3361eaf8618930471fdc3c21bdf5cbcAndreas Huber        source = new HTTPLiveSource(notify, httpService, url, headers);
217afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    } else if (!strncasecmp(url, "rtsp://", 7)) {
2181b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        source = new RTSPSource(
2191b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                notify, httpService, url, headers, mUIDValid, mUID);
2207a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    } else if ((!strncasecmp(url, "http://", 7)
2217a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                || !strncasecmp(url, "https://", 8))
2227a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                    && ((len >= 4 && !strcasecmp(".sdp", &url[len - 4]))
2237a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                    || strstr(url, ".sdp?"))) {
2241b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        source = new RTSPSource(
2251b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                notify, httpService, url, headers, mUIDValid, mUID, true);
2262bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    } else {
22781e68448f3361eaf8618930471fdc3c21bdf5cbcAndreas Huber        source = new GenericSource(notify, httpService, url, headers);
2282bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
2292bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
230afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    msg->setObject("source", source);
231afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    msg->post();
232afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
233afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
2349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::setDataSourceAsync(int fd, int64_t offset, int64_t length) {
235afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
236afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
237b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    sp<AMessage> notify = new AMessage(kWhatSourceNotify, id());
238b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
239b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    sp<Source> source = new GenericSource(notify, fd, offset, length);
240afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    msg->setObject("source", source);
241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::prepareAsync() {
2459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    (new AMessage(kWhatPrepare, id()))->post();
2469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
2479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
24857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Hubervoid NuPlayer::setVideoSurfaceTextureAsync(
2498ba01021b573889802e67e029225a96f0dfa471aAndy McFadden        const sp<IGraphicBufferProducer> &bufferProducer) {
2501173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id());
25157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
2528ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    if (bufferProducer == NULL) {
25357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber        msg->setObject("native-window", NULL);
25457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    } else {
25557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber        msg->setObject(
25657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber                "native-window",
25757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber                new NativeWindowWrapper(
2581a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian                    new Surface(bufferProducer)));
25957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    }
26057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
264f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) {
265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id());
266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setObject("sink", sink);
267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
270f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() {
271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    (new AMessage(kWhatStart, id()))->post();
272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
27443c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() {
275b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    (new AMessage(kWhatPause, id()))->post();
27643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
27743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
27843c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() {
279b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    (new AMessage(kWhatResume, id()))->post();
28043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
28143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
2821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() {
2831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (new AMessage(kWhatReset, id()))->post();
2841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
2851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
28643c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) {
28743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSeek, id());
28843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->setInt64("seekTimeUs", seekTimeUs);
28943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->post();
29043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
29143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
29253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static
2931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) {
29453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    switch (state) {
29553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        case FLUSHING_DECODER:
2961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
2971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = false;
29853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
29953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
30053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
3011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case FLUSHING_DECODER_SHUTDOWN:
3021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
3031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = true;
30453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
30553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
30653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
30753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        default:
30853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return false;
30953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    }
31053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber}
31153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
312f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetDataSource:
315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
3163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSetDataSource");
317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(mSource == NULL);
319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3205bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            sp<RefBase> obj;
3215bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            CHECK(msg->findObject("source", &obj));
322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3235bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource = static_cast<Source *>(obj.get());
324b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
325b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber            looper()->registerHandler(mSource);
3269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
3279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            CHECK(mDriver != NULL);
3289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            sp<NuPlayerDriver> driver = mDriver.promote();
3299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            if (driver != NULL) {
3309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber                driver->notifySetDataSourceCompleted(OK);
3319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            }
3329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            break;
3339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        }
3349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
3359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case kWhatPrepare:
3369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        {
3379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            mSource->prepareAsync();
338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
341dcb89b3b505522efde173c105a851c412f947178Chong Zhang        case kWhatGetTrackInfo:
342dcb89b3b505522efde173c105a851c412f947178Chong Zhang        {
343dcb89b3b505522efde173c105a851c412f947178Chong Zhang            uint32_t replyID;
344dcb89b3b505522efde173c105a851c412f947178Chong Zhang            CHECK(msg->senderAwaitsResponse(&replyID));
345dcb89b3b505522efde173c105a851c412f947178Chong Zhang
346dcb89b3b505522efde173c105a851c412f947178Chong Zhang            status_t err = INVALID_OPERATION;
347dcb89b3b505522efde173c105a851c412f947178Chong Zhang            if (mSource != NULL) {
348dcb89b3b505522efde173c105a851c412f947178Chong Zhang                Parcel* reply;
349dcb89b3b505522efde173c105a851c412f947178Chong Zhang                CHECK(msg->findPointer("reply", (void**)&reply));
350dcb89b3b505522efde173c105a851c412f947178Chong Zhang                err = mSource->getTrackInfo(reply);
351dcb89b3b505522efde173c105a851c412f947178Chong Zhang            }
352dcb89b3b505522efde173c105a851c412f947178Chong Zhang
353dcb89b3b505522efde173c105a851c412f947178Chong Zhang            sp<AMessage> response = new AMessage;
354dcb89b3b505522efde173c105a851c412f947178Chong Zhang            response->setInt32("err", err);
355dcb89b3b505522efde173c105a851c412f947178Chong Zhang
356dcb89b3b505522efde173c105a851c412f947178Chong Zhang            response->postReply(replyID);
357dcb89b3b505522efde173c105a851c412f947178Chong Zhang            break;
358dcb89b3b505522efde173c105a851c412f947178Chong Zhang        }
359dcb89b3b505522efde173c105a851c412f947178Chong Zhang
360dcb89b3b505522efde173c105a851c412f947178Chong Zhang        case kWhatSelectTrack:
361dcb89b3b505522efde173c105a851c412f947178Chong Zhang        {
362dcb89b3b505522efde173c105a851c412f947178Chong Zhang            uint32_t replyID;
363dcb89b3b505522efde173c105a851c412f947178Chong Zhang            CHECK(msg->senderAwaitsResponse(&replyID));
364dcb89b3b505522efde173c105a851c412f947178Chong Zhang
365dcb89b3b505522efde173c105a851c412f947178Chong Zhang            status_t err = INVALID_OPERATION;
366dcb89b3b505522efde173c105a851c412f947178Chong Zhang            if (mSource != NULL) {
367dcb89b3b505522efde173c105a851c412f947178Chong Zhang                size_t trackIndex;
368dcb89b3b505522efde173c105a851c412f947178Chong Zhang                int32_t select;
369dcb89b3b505522efde173c105a851c412f947178Chong Zhang                CHECK(msg->findSize("trackIndex", &trackIndex));
370dcb89b3b505522efde173c105a851c412f947178Chong Zhang                CHECK(msg->findInt32("select", &select));
371dcb89b3b505522efde173c105a851c412f947178Chong Zhang                err = mSource->selectTrack(trackIndex, select);
372dcb89b3b505522efde173c105a851c412f947178Chong Zhang            }
373dcb89b3b505522efde173c105a851c412f947178Chong Zhang
374dcb89b3b505522efde173c105a851c412f947178Chong Zhang            sp<AMessage> response = new AMessage;
375dcb89b3b505522efde173c105a851c412f947178Chong Zhang            response->setInt32("err", err);
376dcb89b3b505522efde173c105a851c412f947178Chong Zhang
377dcb89b3b505522efde173c105a851c412f947178Chong Zhang            response->postReply(replyID);
378dcb89b3b505522efde173c105a851c412f947178Chong Zhang            break;
379dcb89b3b505522efde173c105a851c412f947178Chong Zhang        }
380dcb89b3b505522efde173c105a851c412f947178Chong Zhang
381b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber        case kWhatPollDuration:
382b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber        {
383b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            int32_t generation;
384b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            CHECK(msg->findInt32("generation", &generation));
385b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
386b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            if (generation != mPollDurationGeneration) {
387b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                // stale
388b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                break;
389b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            }
390b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
391b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            int64_t durationUs;
392b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) {
393b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                sp<NuPlayerDriver> driver = mDriver.promote();
394b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                if (driver != NULL) {
395b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                    driver->notifyDuration(durationUs);
396b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                }
397b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            }
398b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
399b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            msg->post(1000000ll);  // poll again in a second.
400b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            break;
401b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber        }
402b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
4031173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        case kWhatSetVideoNativeWindow:
404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
4053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSetVideoNativeWindow");
406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
40757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber            mDeferredActions.push_back(
40814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber                    new ShutdownDecoderAction(
40914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber                        false /* audio */, true /* video */));
41057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
4121173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            CHECK(msg->findObject("native-window", &obj));
413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
41457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber            mDeferredActions.push_back(
41557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber                    new SetSurfaceAction(
41657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber                        static_cast<NativeWindowWrapper *>(obj.get())));
41757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
41857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber            if (obj != NULL) {
41957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber                // If there is a new surface texture, instantiate decoders
42057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber                // again if possible.
42157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber                mDeferredActions.push_back(
42257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber                        new SimpleAction(&NuPlayer::performScanSources));
42357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber            }
4240d268a3cae145afb2720c88ae38fb81550be5584James Dong
42557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber            processDeferredActions();
426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetAudioSink:
430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
4313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSetAudioSink");
432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findObject("sink", &obj));
435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get());
437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatStart:
441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
4423856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatStart");
44343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
4443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mVideoIsAVC = false;
445da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo            mNeedsSwRenderer = false;
4461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mAudioEOS = false;
4471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mVideoEOS = false;
44832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            mSkipRenderingAudioUntilMediaTimeUs = -1;
44932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            mSkipRenderingVideoUntilMediaTimeUs = -1;
4503fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mVideoLateByUs = 0;
4513fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mNumFramesTotal = 0;
4523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mNumFramesDropped = 0;
45357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber            mStarted = true;
4541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4555bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource->start();
456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
457d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber            uint32_t flags = 0;
458d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
459d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber            if (mSource->isRealTime()) {
460d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber                flags |= Renderer::FLAG_REAL_TIME;
461d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber            }
462d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mRenderer = new Renderer(
464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioSink,
465d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber                    new AMessage(kWhatRendererNotify, id()),
466d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber                    flags);
467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            looper()->registerHandler(mRenderer);
469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            postScanSources();
471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
474f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatScanSources:
475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
4761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            int32_t generation;
4771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            CHECK(msg->findInt32("generation", &generation));
4781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (generation != mScanSourcesGeneration) {
4791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // Drop obsolete msg.
4801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
4811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4835bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mScanSourcesPending = false;
4845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
4853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("scanning sources haveAudio=%d, haveVideo=%d",
48643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 mAudioDecoder != NULL, mVideoDecoder != NULL);
48743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
488b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            bool mHadAnySourcesBefore =
489b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                (mAudioDecoder != NULL) || (mVideoDecoder != NULL);
490b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
4915d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George            if (mNativeWindow != NULL) {
4925d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George                instantiateDecoder(false, &mVideoDecoder);
4935d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George            }
494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
495f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioSink != NULL) {
4965bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                instantiateDecoder(true, &mAudioDecoder);
497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
499b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            if (!mHadAnySourcesBefore
500b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                    && (mAudioDecoder != NULL || mVideoDecoder != NULL)) {
501b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                // This is the first time we've found anything playable.
502b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
5039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber                if (mSourceFlags & Source::FLAG_DYNAMIC_DURATION) {
504b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                    schedulePollDuration();
505b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                }
506b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            }
507b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
508eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber            status_t err;
509eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber            if ((err = mSource->feedMoreTSData()) != OK) {
5101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
5111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // We're not currently decoding anything (no audio or
5121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // video tracks found) and we just ran out of input data.
513eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber
514eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    if (err == ERROR_END_OF_STREAM) {
515eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                        notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
516eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    } else {
517eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                        notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
518eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    }
5191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                }
520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
523fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber            if ((mAudioDecoder == NULL && mAudioSink != NULL)
524fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber                    || (mVideoDecoder == NULL && mNativeWindow != NULL)) {
525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->post(100000ll);
5265bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                mScanSourcesPending = true;
527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatVideoNotify:
532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatAudioNotify:
533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            bool audio = msg->what() == kWhatAudioNotify;
535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<AMessage> codecRequest;
537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findMessage("codec-request", &codecRequest));
538f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(codecRequest->findInt32("what", &what));
541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == ACodec::kWhatFillThisBuffer) {
543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                status_t err = feedDecoderInputData(
544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        audio, codecRequest);
545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5465bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                if (err == -EWOULDBLOCK) {
547eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    if (mSource->feedMoreTSData() == OK) {
5481183a4ab06b9fe01fe39a4b8728bfc71789361fcAndreas Huber                        msg->post(10000ll);
5495bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                    }
550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatEOS) {
552dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                int32_t err;
553dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                CHECK(codecRequest->findInt32("err", &err));
554dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber
555dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                if (err == ERROR_END_OF_STREAM) {
5563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("got %s decoder EOS", audio ? "audio" : "video");
557dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                } else {
5583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("got %s decoder EOS w/ error %d",
559dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                         audio ? "audio" : "video",
560dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                         err);
561dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                }
562dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber
563dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                mRenderer->queueEOS(audio, err);
564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatFlushCompleted) {
5651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                bool needShutdown;
56653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
5681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingAudio, &needShutdown));
569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingAudio = FLUSHED;
570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
5711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingVideo, &needShutdown));
572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingVideo = FLUSHED;
5733fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
5743fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mVideoLateByUs = 0;
575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("decoder %s flush completed", audio ? "audio" : "video");
578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (needShutdown) {
5803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("initiating %s decoder shutdown",
58153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                         audio ? "audio" : "video");
582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
58353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown();
584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
58553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    if (audio) {
58653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingAudio = SHUTTING_DOWN_DECODER;
58753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    } else {
58853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingVideo = SHUTTING_DOWN_DECODER;
58953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    }
590f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
5913831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
5923831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
5932c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            } else if (what == ACodec::kWhatOutputFormatChanged) {
59431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                if (audio) {
59531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t numChannels;
596516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    CHECK(codecRequest->findInt32(
597516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                                "channel-count", &numChannels));
5982c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
59931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t sampleRate;
60031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("sample-rate", &sampleRate));
6012c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
6023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("Audio output format changed to %d Hz, %d channels",
60331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         sampleRate, numChannels);
6042c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
60531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->close();
6061948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent
6071948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    audio_output_flags_t flags;
6081948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    int64_t durationUs;
609516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    // FIXME: we should handle the case where the video decoder
610516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    // is created after we receive the format change indication.
611516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    // Current code will just make that we select deep buffer
612516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    // with video which should not be a problem as it should
6131948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    // not prevent from keeping A/V sync.
6141948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    if (mVideoDecoder == NULL &&
6151948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                            mSource->getDuration(&durationUs) == OK &&
616516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                            durationUs
617516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                                > AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US) {
6181948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                        flags = AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
6191948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    } else {
6201948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                        flags = AUDIO_OUTPUT_FLAG_NONE;
6211948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    }
6221948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent
6239806555d3930be43e11106281dee354820ac1c88Andreas Huber                    int32_t channelMask;
6249806555d3930be43e11106281dee354820ac1c88Andreas Huber                    if (!codecRequest->findInt32("channel-mask", &channelMask)) {
6259806555d3930be43e11106281dee354820ac1c88Andreas Huber                        channelMask = CHANNEL_MASK_USE_CHANNEL_ORDER;
6269806555d3930be43e11106281dee354820ac1c88Andreas Huber                    }
6279806555d3930be43e11106281dee354820ac1c88Andreas Huber
628078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                    CHECK_EQ(mAudioSink->open(
629078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                sampleRate,
630078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                numChannels,
6319806555d3930be43e11106281dee354820ac1c88Andreas Huber                                (audio_channel_mask_t)channelMask,
632078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                AUDIO_FORMAT_PCM_16_BIT,
6331948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                                8 /* bufferCount */,
6341948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                                NULL,
6351948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                                NULL,
6361948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                                flags),
637078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                             (status_t)OK);
63831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->start();
6393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
64031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mRenderer->signalAudioSinkChanged();
64131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                } else {
64231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    // video
64331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
64431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t width, height;
64531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("width", &width));
64631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("height", &height));
64731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
64831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t cropLeft, cropTop, cropRight, cropBottom;
64931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findRect(
65031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                "crop",
65131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                &cropLeft, &cropTop, &cropRight, &cropBottom));
65231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
653516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    int32_t displayWidth = cropRight - cropLeft + 1;
654516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    int32_t displayHeight = cropBottom - cropTop + 1;
655516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber
6563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("Video output format changed to %d x %d "
657cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         "(crop: %d x %d @ (%d, %d))",
65831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         width, height,
659516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                         displayWidth,
660516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                         displayHeight,
661cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         cropLeft, cropTop);
66231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
663516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    sp<AMessage> videoInputFormat =
664516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                        mSource->getFormat(false /* audio */);
665516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber
666516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    // Take into account sample aspect ratio if necessary:
667516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    int32_t sarWidth, sarHeight;
668516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    if (videoInputFormat->findInt32("sar-width", &sarWidth)
669516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                            && videoInputFormat->findInt32(
670516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                                "sar-height", &sarHeight)) {
671516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                        ALOGV("Sample aspect ratio %d : %d",
672516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                              sarWidth, sarHeight);
673516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber
674516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                        displayWidth = (displayWidth * sarWidth) / sarHeight;
675516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber
676516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                        ALOGV("display dimensions %d x %d",
677516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                              displayWidth, displayHeight);
678516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    }
679516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber
68031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    notifyListener(
681516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                            MEDIA_SET_VIDEO_SIZE, displayWidth, displayHeight);
682da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo
683da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo                    if (mNeedsSwRenderer && mNativeWindow != NULL) {
684da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo                        int32_t colorFormat;
685da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo                        CHECK(codecRequest->findInt32("color-format", &colorFormat));
686da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo
687da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo                        sp<MetaData> meta = new MetaData;
688da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo                        meta->setInt32(kKeyWidth, width);
689da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo                        meta->setInt32(kKeyHeight, height);
690da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo                        meta->setRect(kKeyCropRect, cropLeft, cropTop, cropRight, cropBottom);
691da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo                        meta->setInt32(kKeyColorFormat, colorFormat);
692da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo
693da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo                        mRenderer->setSoftRenderer(
694da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo                                new SoftwareRenderer(mNativeWindow->getNativeWindow(), meta));
695da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo                    }
69631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                }
6973831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber            } else if (what == ACodec::kWhatShutdownCompleted) {
6983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("%s shutdown completed", audio ? "audio" : "video");
6993831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                if (audio) {
7003831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mAudioDecoder.clear();
7013831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
7023831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER);
7033831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingAudio = SHUT_DOWN;
7043831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                } else {
7053831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mVideoDecoder.clear();
7063831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
7073831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER);
7083831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingVideo = SHUT_DOWN;
7093831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                }
7103831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
7113831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
712c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber            } else if (what == ACodec::kWhatError) {
71329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("Received error from %s decoder, aborting playback.",
714c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                     audio ? "audio" : "video");
715c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
716c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                mRenderer->queueEOS(audio, UNKNOWN_ERROR);
7175778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else if (what == ACodec::kWhatDrainThisBuffer) {
718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                renderBuffer(audio, codecRequest);
719da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo            } else if (what == ACodec::kWhatComponentAllocated) {
720da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo                if (!audio) {
721da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo                    AString name;
722da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo                    CHECK(codecRequest->findString("componentName", &name));
723da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo                    mNeedsSwRenderer = name.startsWith("OMX.google.");
724da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo                }
725da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo            } else if (what != ACodec::kWhatComponentConfigured
726a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                    && what != ACodec::kWhatBuffersAllocated) {
727a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                ALOGV("Unhandled codec notification %d '%c%c%c%c'.",
728a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                      what,
729a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                      what >> 24,
730a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                      (what >> 16) & 0xff,
731a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                      (what >> 8) & 0xff,
732a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                      what & 0xff);
733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatRendererNotify:
739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("what", &what));
742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == Renderer::kWhatEOS) {
744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
746f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
747c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                int32_t finalResult;
748c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                CHECK(msg->findInt32("finalResult", &finalResult));
749c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioEOS = true;
752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
753f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mVideoEOS = true;
754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
756c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                if (finalResult == ERROR_END_OF_STREAM) {
7573856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("reached %s EOS", audio ? "audio" : "video");
758c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                } else {
75929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                    ALOGE("%s track encountered an error (%d)",
760c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                         audio ? "audio" : "video", finalResult);
761c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
762c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                    notifyListener(
763c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                            MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult);
764c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                }
765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
766f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if ((mAudioEOS || mAudioDecoder == NULL)
767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        && (mVideoEOS || mVideoDecoder == NULL)) {
768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
77043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            } else if (what == Renderer::kWhatPosition) {
77143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                int64_t positionUs;
77243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                CHECK(msg->findInt64("positionUs", &positionUs));
77343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
7743fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                CHECK(msg->findInt64("videoLateByUs", &mVideoLateByUs));
7753fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
77643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (mDriver != NULL) {
77743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    sp<NuPlayerDriver> driver = mDriver.promote();
77843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    if (driver != NULL) {
77943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                        driver->notifyPosition(positionUs);
7803fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
7813fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        driver->notifyFrameStats(
7823fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                                mNumFramesTotal, mNumFramesDropped);
78343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    }
78443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
7853fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            } else if (what == Renderer::kWhatFlushComplete) {
786f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
788f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("renderer %s flush completed.", audio ? "audio" : "video");
790f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong            } else if (what == Renderer::kWhatVideoRenderingStart) {
791f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong                notifyListener(MEDIA_INFO, MEDIA_INFO_RENDERING_START, 0);
792cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar            } else if (what == Renderer::kWhatMediaRenderingStart) {
793cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar                ALOGV("media rendering started");
794cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar                notifyListener(MEDIA_STARTED, 0, 0);
795f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatMoreDataQueued:
800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case kWhatReset:
8051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        {
8063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatReset");
8071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
808a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            mDeferredActions.push_back(
80914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber                    new ShutdownDecoderAction(
81014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber                        true /* audio */, true /* video */));
811b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber
812a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            mDeferredActions.push_back(
813a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                    new SimpleAction(&NuPlayer::performReset));
8141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
815a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            processDeferredActions();
8161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            break;
8171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
8181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
81943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        case kWhatSeek:
82043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        {
82143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            int64_t seekTimeUs;
82243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
82343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
824a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            ALOGV("kWhatSeek seekTimeUs=%lld us", seekTimeUs);
82543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
826a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            mDeferredActions.push_back(
827a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                    new SimpleAction(&NuPlayer::performDecoderFlush));
82843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
829a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            mDeferredActions.push_back(new SeekAction(seekTimeUs));
83043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
831a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            processDeferredActions();
83243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            break;
83343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
83443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
835b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatPause:
836b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
837b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
838fba60daf77cc74a13ae3bf4b0e9925dd2ee4470cRoger Jönsson            mSource->pause();
839b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->pause();
840b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
841b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
842b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
843b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatResume:
844b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
845b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
846fba60daf77cc74a13ae3bf4b0e9925dd2ee4470cRoger Jönsson            mSource->resume();
847b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->resume();
848b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
849b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
850b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
851b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber        case kWhatSourceNotify:
852b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber        {
8539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            onSourceNotify(msg);
854b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber            break;
855b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber        }
856b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            TRESPASS();
859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
860f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
861f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
862f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8633831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() {
8643831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) {
8653831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
8663831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
8673831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
8683831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) {
8693831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
8703831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
8713831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
8723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("both audio and video are flushed now.");
8733831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
8746e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (mTimeDiscontinuityPending) {
8756e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        mRenderer->signalTimeDiscontinuity();
8766e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        mTimeDiscontinuityPending = false;
8776e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
8783831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
87922fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mAudioDecoder != NULL) {
8803831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mAudioDecoder->signalResume();
8813831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
8823831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
88322fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mVideoDecoder != NULL) {
8843831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mVideoDecoder->signalResume();
8853831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
8863831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
8873831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingAudio = NONE;
8883831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingVideo = NONE;
889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
890a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    processDeferredActions();
8911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
8921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() {
8941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mScanSourcesPending) {
8951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        return;
896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
8971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    sp<AMessage> msg = new AMessage(kWhatScanSources, id());
8991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->setInt32("generation", mScanSourcesGeneration);
9001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->post();
9011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mScanSourcesPending = true;
903f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
9055bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) {
906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (*decoder != NULL) {
907f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
908f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
909f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
910840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    sp<AMessage> format = mSource->getFormat(audio);
911f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
912840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    if (format == NULL) {
913f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return -EWOULDBLOCK;
914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
9163fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    if (!audio) {
917840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        AString mime;
918840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        CHECK(format->findString("mime", &mime));
919840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime.c_str());
9203fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    }
9213fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
922f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notify =
923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify,
924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     id());
925f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
9261173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    *decoder = audio ? new Decoder(notify) :
9271173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                       new Decoder(notify, mNativeWindow);
928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    looper()->registerHandler(*decoder);
929f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
930840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    (*decoder)->configure(format);
931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
933f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
934f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
935f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
936f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
937f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
938f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
93953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    if ((audio && IsFlushingState(mFlushingAudio))
94053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            || (!audio && IsFlushingState(mFlushingVideo))) {
941f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->setInt32("err", INFO_DISCONTINUITY);
942f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->post();
943f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
944f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
946f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> accessUnit;
947f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
9483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    bool dropAccessUnit;
9493fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    do {
9503fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        status_t err = mSource->dequeueAccessUnit(audio, &accessUnit);
9515bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
9523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (err == -EWOULDBLOCK) {
9533fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            return err;
9543fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        } else if (err != OK) {
9553fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            if (err == INFO_DISCONTINUITY) {
9563fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                int32_t type;
9573fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                CHECK(accessUnit->meta()->findInt32("discontinuity", &type));
95853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
9593fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                bool formatChange =
9606e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    (audio &&
9616e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                     (type & ATSParser::DISCONTINUITY_AUDIO_FORMAT))
9626e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    || (!audio &&
9636e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            (type & ATSParser::DISCONTINUITY_VIDEO_FORMAT));
96453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
9656e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                bool timeChange = (type & ATSParser::DISCONTINUITY_TIME) != 0;
9666e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
967df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block                ALOGI("%s discontinuity (formatChange=%d, time=%d)",
9686e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                     audio ? "audio" : "video", formatChange, timeChange);
96932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
9703fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                if (audio) {
9713fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mSkipRenderingAudioUntilMediaTimeUs = -1;
9723fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                } else {
9733fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mSkipRenderingVideoUntilMediaTimeUs = -1;
9743fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                }
97532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
9766e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                if (timeChange) {
9776e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    sp<AMessage> extra;
9786e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    if (accessUnit->meta()->findMessage("extra", &extra)
9796e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            && extra != NULL) {
9806e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        int64_t resumeAtMediaTimeUs;
9816e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        if (extra->findInt64(
9826e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) {
983df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block                            ALOGI("suppressing rendering of %s until %lld us",
9846e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    audio ? "audio" : "video", resumeAtMediaTimeUs);
9856e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
9866e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            if (audio) {
9876e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                mSkipRenderingAudioUntilMediaTimeUs =
9886e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    resumeAtMediaTimeUs;
9896e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            } else {
9906e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                mSkipRenderingVideoUntilMediaTimeUs =
9916e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    resumeAtMediaTimeUs;
9926e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            }
9933fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        }
99432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                    }
99532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                }
9963fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
9976e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                mTimeDiscontinuityPending =
9986e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    mTimeDiscontinuityPending || timeChange;
9996e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
10006e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                if (formatChange || timeChange) {
1001a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                    if (mFlushingAudio == NONE && mFlushingVideo == NONE) {
1002a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                        // And we'll resume scanning sources once we're done
1003a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                        // flushing.
1004a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                        mDeferredActions.push_front(
1005a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                                new SimpleAction(
1006a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                                    &NuPlayer::performScanSources));
1007a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                    }
1008a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
10096d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih                    sp<AMessage> newFormat = mSource->getFormat(audio);
10106d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih                    sp<Decoder> &decoder = audio ? mAudioDecoder : mVideoDecoder;
10116d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih                    if (formatChange && !decoder->supportsSeamlessFormatChange(newFormat)) {
10126d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih                        flushDecoder(audio, /* needShutdown = */ true);
10136d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih                    } else {
10146d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih                        flushDecoder(audio, /* needShutdown = */ false);
10156d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih                        err = OK;
10166d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih                    }
10176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                } else {
10186e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    // This stream is unaffected by the discontinuity
10196e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
10206e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    if (audio) {
10216e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        mFlushingAudio = FLUSHED;
10226e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    } else {
10236e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        mFlushingVideo = FLUSHED;
10246e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    }
10256e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
10266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    finishFlushIfPossible();
10276e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
10286e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    return -EWOULDBLOCK;
10296e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                }
103032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            }
103132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
10323fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            reply->setInt32("err", err);
10333fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            reply->post();
10343fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            return OK;
1035f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1036f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
10373fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (!audio) {
10383fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            ++mNumFramesTotal;
10393fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        }
10403fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
10413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        dropAccessUnit = false;
10423fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (!audio
10433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && mVideoLateByUs > 100000ll
10443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && mVideoIsAVC
10453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && !IsAVCReferenceFrame(accessUnit)) {
10463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            dropAccessUnit = true;
10473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            ++mNumFramesDropped;
10483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        }
10493fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    } while (dropAccessUnit);
1050f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
10513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    // ALOGV("returned a valid buffer of %s data", audio ? "audio" : "video");
1052f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1053f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0
1054f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t mediaTimeUs;
1055f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs));
10563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("feeding %s input buffer at media time %.2f secs",
1057f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         audio ? "audio" : "video",
1058f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         mediaTimeUs / 1E6);
1059f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif
1060f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
10612d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    reply->setBuffer("buffer", accessUnit);
1062f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->post();
1063f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1064f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
1065f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1066f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1067f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) {
10683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    // ALOGV("renderBuffer %s", audio ? "audio" : "video");
1069f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1070f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
1071f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
1072f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
107318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) {
107418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // We're currently attempting to flush the decoder, in order
107518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // to complete this, the decoder wants all its buffers back,
107618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // so we don't want any output buffers it sent us (from before
107718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // we initiated the flush) to be stuck in the renderer's queue.
107818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
10793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("we're still flushing the %s decoder, sending its output buffer"
108018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber             " right back.", audio ? "audio" : "video");
108118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
108218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        reply->post();
108318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        return;
108418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
108518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
10862d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    sp<ABuffer> buffer;
10872d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    CHECK(msg->findBuffer("buffer", &buffer));
1088f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
108932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    int64_t &skipUntilMediaTimeUs =
109032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        audio
109132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            ? mSkipRenderingAudioUntilMediaTimeUs
109232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            : mSkipRenderingVideoUntilMediaTimeUs;
109332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
109432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    if (skipUntilMediaTimeUs >= 0) {
109532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        int64_t mediaTimeUs;
109632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs));
109732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
109832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        if (mediaTimeUs < skipUntilMediaTimeUs) {
10993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("dropping %s buffer at time %lld as requested.",
110032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 audio ? "audio" : "video",
110132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 mediaTimeUs);
110232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
110332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            reply->post();
110432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            return;
110532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        }
110632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
110732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        skipUntilMediaTimeUs = -1;
110832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    }
110932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
1110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mRenderer->queueBuffer(audio, buffer, reply);
1111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1113dcb89b3b505522efde173c105a851c412f947178Chong Zhangvoid NuPlayer::notifyListener(int msg, int ext1, int ext2, const Parcel *in) {
111443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver == NULL) {
1115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
1116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
111843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<NuPlayerDriver> driver = mDriver.promote();
1119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
112043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (driver == NULL) {
1121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
1122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1124dcb89b3b505522efde173c105a851c412f947178Chong Zhang    driver->notifyListener(msg, ext1, ext2, in);
1125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
11271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) {
112814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    ALOGV("[%s] flushDecoder needShutdown=%d",
112914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber          audio ? "audio" : "video", needShutdown);
113014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
11316e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if ((audio && mAudioDecoder == NULL) || (!audio && mVideoDecoder == NULL)) {
1132df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("flushDecoder %s without decoder present",
11336e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber             audio ? "audio" : "video");
11346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
11356e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
11361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    // Make sure we don't continue to scan sources until we finish flushing.
11371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    ++mScanSourcesGeneration;
113843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mScanSourcesPending = false;
11391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
11401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (audio ? mAudioDecoder : mVideoDecoder)->signalFlush();
11411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer->flush(audio);
11421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
11431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    FlushStatus newStatus =
11441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER;
11451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
11461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (audio) {
11471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingAudio == NONE
11481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingAudio == AWAITING_DISCONTINUITY);
11491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
11501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingAudio = newStatus;
11511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
11521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingVideo == NONE) {
11531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingVideo = (mVideoDecoder != NULL)
11541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
11551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
11561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
11571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else {
11581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingVideo == NONE
11591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingVideo == AWAITING_DISCONTINUITY);
11601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
11611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingVideo = newStatus;
11621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
11631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingAudio == NONE) {
11641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingAudio = (mAudioDecoder != NULL)
11651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
11661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
11671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
11681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
11691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
11701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
1171840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Hubersp<AMessage> NuPlayer::Source::getFormat(bool audio) {
1172840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    sp<MetaData> meta = getFormatMeta(audio);
1173840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
1174840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    if (meta == NULL) {
1175840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        return NULL;
1176840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    }
1177840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
1178840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    sp<AMessage> msg = new AMessage;
1179840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
1180840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    if(convertMetaDataToMessage(meta, &msg) == OK) {
1181840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        return msg;
1182840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    }
1183840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    return NULL;
1184840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber}
1185840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
11860d268a3cae145afb2720c88ae38fb81550be5584James Dongstatus_t NuPlayer::setVideoScalingMode(int32_t mode) {
11870d268a3cae145afb2720c88ae38fb81550be5584James Dong    mVideoScalingMode = mode;
118857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    if (mNativeWindow != NULL) {
11890d268a3cae145afb2720c88ae38fb81550be5584James Dong        status_t ret = native_window_set_scaling_mode(
11900d268a3cae145afb2720c88ae38fb81550be5584James Dong                mNativeWindow->getNativeWindow().get(), mVideoScalingMode);
11910d268a3cae145afb2720c88ae38fb81550be5584James Dong        if (ret != OK) {
11920d268a3cae145afb2720c88ae38fb81550be5584James Dong            ALOGE("Failed to set scaling mode (%d): %s",
11930d268a3cae145afb2720c88ae38fb81550be5584James Dong                -ret, strerror(-ret));
11940d268a3cae145afb2720c88ae38fb81550be5584James Dong            return ret;
11950d268a3cae145afb2720c88ae38fb81550be5584James Dong        }
11960d268a3cae145afb2720c88ae38fb81550be5584James Dong    }
11970d268a3cae145afb2720c88ae38fb81550be5584James Dong    return OK;
11980d268a3cae145afb2720c88ae38fb81550be5584James Dong}
11990d268a3cae145afb2720c88ae38fb81550be5584James Dong
1200dcb89b3b505522efde173c105a851c412f947178Chong Zhangstatus_t NuPlayer::getTrackInfo(Parcel* reply) const {
1201dcb89b3b505522efde173c105a851c412f947178Chong Zhang    sp<AMessage> msg = new AMessage(kWhatGetTrackInfo, id());
1202dcb89b3b505522efde173c105a851c412f947178Chong Zhang    msg->setPointer("reply", reply);
1203dcb89b3b505522efde173c105a851c412f947178Chong Zhang
1204dcb89b3b505522efde173c105a851c412f947178Chong Zhang    sp<AMessage> response;
1205dcb89b3b505522efde173c105a851c412f947178Chong Zhang    status_t err = msg->postAndAwaitResponse(&response);
1206dcb89b3b505522efde173c105a851c412f947178Chong Zhang    return err;
1207dcb89b3b505522efde173c105a851c412f947178Chong Zhang}
1208dcb89b3b505522efde173c105a851c412f947178Chong Zhang
1209dcb89b3b505522efde173c105a851c412f947178Chong Zhangstatus_t NuPlayer::selectTrack(size_t trackIndex, bool select) {
1210dcb89b3b505522efde173c105a851c412f947178Chong Zhang    sp<AMessage> msg = new AMessage(kWhatSelectTrack, id());
1211dcb89b3b505522efde173c105a851c412f947178Chong Zhang    msg->setSize("trackIndex", trackIndex);
1212dcb89b3b505522efde173c105a851c412f947178Chong Zhang    msg->setInt32("select", select);
1213dcb89b3b505522efde173c105a851c412f947178Chong Zhang
1214dcb89b3b505522efde173c105a851c412f947178Chong Zhang    sp<AMessage> response;
1215dcb89b3b505522efde173c105a851c412f947178Chong Zhang    status_t err = msg->postAndAwaitResponse(&response);
1216dcb89b3b505522efde173c105a851c412f947178Chong Zhang
1217dcb89b3b505522efde173c105a851c412f947178Chong Zhang    return err;
1218dcb89b3b505522efde173c105a851c412f947178Chong Zhang}
1219dcb89b3b505522efde173c105a851c412f947178Chong Zhang
1220b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Hubervoid NuPlayer::schedulePollDuration() {
1221b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    sp<AMessage> msg = new AMessage(kWhatPollDuration, id());
1222b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    msg->setInt32("generation", mPollDurationGeneration);
1223b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    msg->post();
1224b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber}
1225b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
1226b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Hubervoid NuPlayer::cancelPollDuration() {
1227b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    ++mPollDurationGeneration;
1228b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber}
1229b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
1230a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::processDeferredActions() {
1231a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    while (!mDeferredActions.empty()) {
1232a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        // We won't execute any deferred actions until we're no longer in
1233a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        // an intermediate state, i.e. one more more decoders are currently
1234a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        // flushing or shutting down.
1235a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1236a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        if (mRenderer != NULL) {
1237a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            // There's an edge case where the renderer owns all output
1238a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            // buffers and is paused, therefore the decoder will not read
1239a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            // more input data and will never encounter the matching
1240a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            // discontinuity. To avoid this, we resume the renderer.
1241a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1242a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            if (mFlushingAudio == AWAITING_DISCONTINUITY
1243a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                    || mFlushingVideo == AWAITING_DISCONTINUITY) {
1244a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                mRenderer->resume();
1245a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            }
1246a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        }
1247a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1248a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        if (mFlushingAudio != NONE || mFlushingVideo != NONE) {
1249a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            // We're currently flushing, postpone the reset until that's
1250a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            // completed.
1251a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1252a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            ALOGV("postponing action mFlushingAudio=%d, mFlushingVideo=%d",
1253a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                  mFlushingAudio, mFlushingVideo);
1254a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1255a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            break;
1256a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        }
1257a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1258a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        sp<Action> action = *mDeferredActions.begin();
1259a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        mDeferredActions.erase(mDeferredActions.begin());
1260a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1261a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        action->execute(this);
1262a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1263a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber}
1264a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1265a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::performSeek(int64_t seekTimeUs) {
1266a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    ALOGV("performSeek seekTimeUs=%lld us (%.2f secs)",
1267a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber          seekTimeUs,
1268a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber          seekTimeUs / 1E6);
1269a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1270a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    mSource->seekTo(seekTimeUs);
1271a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1272a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    if (mDriver != NULL) {
1273a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
1274a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        if (driver != NULL) {
1275a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            driver->notifyPosition(seekTimeUs);
1276a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            driver->notifySeekComplete();
1277a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        }
1278a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1279a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1280a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    // everything's flushed, continue playback.
1281a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber}
1282a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1283a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::performDecoderFlush() {
1284a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    ALOGV("performDecoderFlush");
1285a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1286da9740e63a835e610519bd235be9137d74b6d409Andreas Huber    if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
1287a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        return;
1288a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1289a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1290a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    mTimeDiscontinuityPending = true;
1291a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1292a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    if (mAudioDecoder != NULL) {
1293a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        flushDecoder(true /* audio */, false /* needShutdown */);
1294a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1295a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1296a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    if (mVideoDecoder != NULL) {
1297a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        flushDecoder(false /* audio */, false /* needShutdown */);
1298a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1299a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber}
1300a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
130114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubervoid NuPlayer::performDecoderShutdown(bool audio, bool video) {
130214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    ALOGV("performDecoderShutdown audio=%d, video=%d", audio, video);
1303a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
130414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    if ((!audio || mAudioDecoder == NULL)
130514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            && (!video || mVideoDecoder == NULL)) {
1306a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        return;
1307a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1308a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1309a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    mTimeDiscontinuityPending = true;
1310a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
131114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    if (mFlushingAudio == NONE && (!audio || mAudioDecoder == NULL)) {
131214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        mFlushingAudio = FLUSHED;
131314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    }
131414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
131514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    if (mFlushingVideo == NONE && (!video || mVideoDecoder == NULL)) {
131614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        mFlushingVideo = FLUSHED;
131714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    }
131814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
131914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    if (audio && mAudioDecoder != NULL) {
1320a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        flushDecoder(true /* audio */, true /* needShutdown */);
1321a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1322a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
132314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    if (video && mVideoDecoder != NULL) {
1324a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        flushDecoder(false /* audio */, true /* needShutdown */);
1325a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1326a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber}
1327a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1328a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::performReset() {
1329a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    ALOGV("performReset");
1330a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1331a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    CHECK(mAudioDecoder == NULL);
1332a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    CHECK(mVideoDecoder == NULL);
1333a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1334a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    cancelPollDuration();
1335a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1336a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    ++mScanSourcesGeneration;
1337a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    mScanSourcesPending = false;
1338a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1339a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    mRenderer.clear();
1340a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1341a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    if (mSource != NULL) {
1342a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        mSource->stop();
1343b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
1344b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber        looper()->unregisterHandler(mSource->id());
1345b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
1346a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        mSource.clear();
1347a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1348a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1349a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    if (mDriver != NULL) {
1350a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
1351a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        if (driver != NULL) {
1352a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            driver->notifyResetComplete();
1353a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        }
1354a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
135557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
135657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    mStarted = false;
1357a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber}
1358a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1359a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::performScanSources() {
1360a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    ALOGV("performScanSources");
1361a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
136257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    if (!mStarted) {
136357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber        return;
136457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    }
136557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
1366a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
1367a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        postScanSources();
1368a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1369a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber}
1370a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
137157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Hubervoid NuPlayer::performSetSurface(const sp<NativeWindowWrapper> &wrapper) {
137257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    ALOGV("performSetSurface");
137357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
137457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    mNativeWindow = wrapper;
137557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
137657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    // XXX - ignore error from setVideoScalingMode for now
137757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    setVideoScalingMode(mVideoScalingMode);
137857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
137957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    if (mDriver != NULL) {
138057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
138157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber        if (driver != NULL) {
138257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber            driver->notifySetSurfaceComplete();
138357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber        }
138457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    }
138557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber}
138657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
13879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::onSourceNotify(const sp<AMessage> &msg) {
13889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    int32_t what;
13899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    CHECK(msg->findInt32("what", &what));
13909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
13919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    switch (what) {
13929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case Source::kWhatPrepared:
13939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        {
1394b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber            if (mSource == NULL) {
1395b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber                // This is a stale notification from a source that was
1396b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber                // asynchronously preparing when the client called reset().
1397b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber                // We handled the reset, the source is gone.
1398b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber                break;
1399b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber            }
1400b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber
1401ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber            int32_t err;
1402ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber            CHECK(msg->findInt32("err", &err));
1403ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber
14049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            sp<NuPlayerDriver> driver = mDriver.promote();
14059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            if (driver != NULL) {
1406ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber                driver->notifyPrepareCompleted(err);
14079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            }
1408997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber
1409997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber            int64_t durationUs;
1410997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber            if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) {
1411997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber                sp<NuPlayerDriver> driver = mDriver.promote();
1412997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber                if (driver != NULL) {
1413997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber                    driver->notifyDuration(durationUs);
1414997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber                }
1415997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber            }
14169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            break;
14179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        }
14189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
14199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case Source::kWhatFlagsChanged:
14209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        {
14219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            uint32_t flags;
14229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            CHECK(msg->findInt32("flags", (int32_t *)&flags));
14239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
14244b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang            sp<NuPlayerDriver> driver = mDriver.promote();
14254b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang            if (driver != NULL) {
14264b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang                driver->notifyFlagsChanged(flags);
14274b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang            }
14284b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang
14299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            if ((mSourceFlags & Source::FLAG_DYNAMIC_DURATION)
14309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber                    && (!(flags & Source::FLAG_DYNAMIC_DURATION))) {
14319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber                cancelPollDuration();
14329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            } else if (!(mSourceFlags & Source::FLAG_DYNAMIC_DURATION)
14339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber                    && (flags & Source::FLAG_DYNAMIC_DURATION)
14349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber                    && (mAudioDecoder != NULL || mVideoDecoder != NULL)) {
14359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber                schedulePollDuration();
14369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            }
14379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
14389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            mSourceFlags = flags;
14399575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            break;
14409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        }
14419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
14429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case Source::kWhatVideoSizeChanged:
14439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        {
14449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            int32_t width, height;
14459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            CHECK(msg->findInt32("width", &width));
14469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            CHECK(msg->findInt32("height", &height));
14479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
14489575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            notifyListener(MEDIA_SET_VIDEO_SIZE, width, height);
14499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            break;
14509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        }
14519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1452b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson        case Source::kWhatBufferingStart:
1453b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson        {
1454b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson            notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_START, 0);
1455b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson            break;
1456b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson        }
1457b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson
1458b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson        case Source::kWhatBufferingEnd:
1459b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson        {
1460b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson            notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_END, 0);
1461b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson            break;
1462b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson        }
1463b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson
1464dcb89b3b505522efde173c105a851c412f947178Chong Zhang        case Source::kWhatSubtitleData:
1465dcb89b3b505522efde173c105a851c412f947178Chong Zhang        {
1466dcb89b3b505522efde173c105a851c412f947178Chong Zhang            sp<ABuffer> buffer;
1467dcb89b3b505522efde173c105a851c412f947178Chong Zhang            CHECK(msg->findBuffer("buffer", &buffer));
1468dcb89b3b505522efde173c105a851c412f947178Chong Zhang
1469dcb89b3b505522efde173c105a851c412f947178Chong Zhang            int32_t trackIndex;
1470dcb89b3b505522efde173c105a851c412f947178Chong Zhang            int64_t timeUs, durationUs;
1471dcb89b3b505522efde173c105a851c412f947178Chong Zhang            CHECK(buffer->meta()->findInt32("trackIndex", &trackIndex));
1472dcb89b3b505522efde173c105a851c412f947178Chong Zhang            CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
1473dcb89b3b505522efde173c105a851c412f947178Chong Zhang            CHECK(buffer->meta()->findInt64("durationUs", &durationUs));
1474dcb89b3b505522efde173c105a851c412f947178Chong Zhang
1475dcb89b3b505522efde173c105a851c412f947178Chong Zhang            Parcel in;
1476dcb89b3b505522efde173c105a851c412f947178Chong Zhang            in.writeInt32(trackIndex);
1477dcb89b3b505522efde173c105a851c412f947178Chong Zhang            in.writeInt64(timeUs);
1478dcb89b3b505522efde173c105a851c412f947178Chong Zhang            in.writeInt64(durationUs);
1479dcb89b3b505522efde173c105a851c412f947178Chong Zhang            in.writeInt32(buffer->size());
1480dcb89b3b505522efde173c105a851c412f947178Chong Zhang            in.writeInt32(buffer->size());
1481dcb89b3b505522efde173c105a851c412f947178Chong Zhang            in.write(buffer->data(), buffer->size());
1482dcb89b3b505522efde173c105a851c412f947178Chong Zhang
1483dcb89b3b505522efde173c105a851c412f947178Chong Zhang            notifyListener(MEDIA_SUBTITLE_DATA, 0, 0, &in);
1484dcb89b3b505522efde173c105a851c412f947178Chong Zhang            break;
1485dcb89b3b505522efde173c105a851c412f947178Chong Zhang        }
1486dcb89b3b505522efde173c105a851c412f947178Chong Zhang
148714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        case Source::kWhatQueueDecoderShutdown:
148814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        {
148914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            int32_t audio, video;
149014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            CHECK(msg->findInt32("audio", &audio));
149114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            CHECK(msg->findInt32("video", &video));
149214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
149314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            sp<AMessage> reply;
149414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            CHECK(msg->findMessage("reply", &reply));
149514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
149614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            queueDecoderShutdown(audio, video, reply);
149714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            break;
149814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        }
149914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
15009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        default:
15019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            TRESPASS();
15029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    }
15039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
15049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1505b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber////////////////////////////////////////////////////////////////////////////////
1506b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
15079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::Source::notifyFlagsChanged(uint32_t flags) {
15089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    sp<AMessage> notify = dupNotify();
15099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notify->setInt32("what", kWhatFlagsChanged);
15109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notify->setInt32("flags", flags);
15119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notify->post();
15129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
15139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
15149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::Source::notifyVideoSizeChanged(int32_t width, int32_t height) {
15159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    sp<AMessage> notify = dupNotify();
15169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notify->setInt32("what", kWhatVideoSizeChanged);
15179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notify->setInt32("width", width);
15189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notify->setInt32("height", height);
15199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notify->post();
15209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
15219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1522ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Hubervoid NuPlayer::Source::notifyPrepared(status_t err) {
15239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    sp<AMessage> notify = dupNotify();
15249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notify->setInt32("what", kWhatPrepared);
1525ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber    notify->setInt32("err", err);
15269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notify->post();
15279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
15289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
152984333e0475bc911adc16417f4ca327c975cf6c36Andreas Hubervoid NuPlayer::Source::onMessageReceived(const sp<AMessage> & /* msg */) {
1530b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    TRESPASS();
1531b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber}
1532b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
153314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubervoid NuPlayer::queueDecoderShutdown(
153414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        bool audio, bool video, const sp<AMessage> &reply) {
153514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    ALOGI("queueDecoderShutdown audio=%d, video=%d", audio, video);
153614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
153714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    mDeferredActions.push_back(
153814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            new ShutdownDecoderAction(audio, video));
153914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
154014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    mDeferredActions.push_back(
154114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            new SimpleAction(&NuPlayer::performScanSources));
154214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
154314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    mDeferredActions.push_back(new PostMessageAction(reply));
154414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
154514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    processDeferredActions();
154614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber}
154714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
1548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
1549