NuPlayer.cpp revision dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28
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
343831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber#include <media/stagefright/foundation/hexdump.h>
35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h>
37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h>
383fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include <media/stagefright/MediaDefs.h>
39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h>
40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h>
418ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h>
42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include "avc_utils.h"
443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
45840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include "ESDS.h"
46840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include <media/stagefright/Utils.h>
47840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
48f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
50a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberstruct NuPlayer::Action : public RefBase {
51a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    Action() {}
52a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
53a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    virtual void execute(NuPlayer *player) = 0;
54a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
55a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberprivate:
56a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(Action);
57a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber};
58a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
59a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberstruct NuPlayer::SeekAction : public Action {
60a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    SeekAction(int64_t seekTimeUs)
61a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        : mSeekTimeUs(seekTimeUs) {
62a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
63a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
64a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    virtual void execute(NuPlayer *player) {
65a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        player->performSeek(mSeekTimeUs);
66a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
67a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
68a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberprivate:
69a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    int64_t mSeekTimeUs;
70a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
71a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(SeekAction);
72a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber};
73a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
7457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huberstruct NuPlayer::SetSurfaceAction : public Action {
7557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    SetSurfaceAction(const sp<NativeWindowWrapper> &wrapper)
7657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber        : mWrapper(wrapper) {
7757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    }
7857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
7957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    virtual void execute(NuPlayer *player) {
8057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber        player->performSetSurface(mWrapper);
8157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    }
8257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
8357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huberprivate:
8457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    sp<NativeWindowWrapper> mWrapper;
8557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
8657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(SetSurfaceAction);
8757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber};
8857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
8914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct NuPlayer::ShutdownDecoderAction : public Action {
9014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    ShutdownDecoderAction(bool audio, bool video)
9114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        : mAudio(audio),
9214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber          mVideo(video) {
9314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    }
9414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
9514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    virtual void execute(NuPlayer *player) {
9614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        player->performDecoderShutdown(mAudio, mVideo);
9714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    }
9814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
9914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprivate:
10014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    bool mAudio;
10114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    bool mVideo;
10214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
10314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(ShutdownDecoderAction);
10414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber};
10514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
10614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct NuPlayer::PostMessageAction : public Action {
10714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    PostMessageAction(const sp<AMessage> &msg)
10814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        : mMessage(msg) {
10914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    }
11014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
11114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    virtual void execute(NuPlayer *) {
11214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        mMessage->post();
11314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    }
11414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
11514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprivate:
11614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<AMessage> mMessage;
11714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
11814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(PostMessageAction);
11914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber};
12014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
121a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber// Use this if there's no state necessary to save in order to execute
122a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber// the action.
123a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberstruct NuPlayer::SimpleAction : public Action {
124a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    typedef void (NuPlayer::*ActionFunc)();
125a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
126a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    SimpleAction(ActionFunc func)
127a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        : mFunc(func) {
128a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
129a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
130a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    virtual void execute(NuPlayer *player) {
131a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        (player->*mFunc)();
132a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
133a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
134a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberprivate:
135a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    ActionFunc mFunc;
136a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
137a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(SimpleAction);
138a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber};
139a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
142f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer()
1439b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    : mUIDValid(false),
1449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber      mSourceFlags(0),
1453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mVideoIsAVC(false),
1469b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber      mAudioEOS(false),
147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mVideoEOS(false),
1485bc087c573c70c84c6a39946457590b42d392a33Andreas Huber      mScanSourcesPending(false),
1491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mScanSourcesGeneration(0),
150b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber      mPollDurationGeneration(0),
1516e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber      mTimeDiscontinuityPending(false),
152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mFlushingAudio(NONE),
1531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mFlushingVideo(NONE),
1543fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mSkipRenderingAudioUntilMediaTimeUs(-1ll),
1553fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mSkipRenderingVideoUntilMediaTimeUs(-1ll),
1563fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mVideoLateByUs(0ll),
1573fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mNumFramesTotal(0ll),
1580d268a3cae145afb2720c88ae38fb81550be5584James Dong      mNumFramesDropped(0ll),
15957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber      mVideoScalingMode(NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW),
16057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber      mStarted(false) {
161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
163f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() {
164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1669b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid NuPlayer::setUID(uid_t uid) {
1679b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUIDValid = true;
1689b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUID = uid;
1699b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber}
1709b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
17143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) {
17243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mDriver = driver;
173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::setDataSourceAsync(const sp<IStreamSource> &source) {
176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
178b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    sp<AMessage> notify = new AMessage(kWhatSourceNotify, id());
179b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
180240abcc4bf661a10ffca24859945796acc76ac6eAndreas Huber    msg->setObject("source", new StreamingSource(notify, source));
1815bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->post();
1825bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
1835bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
184afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatic bool IsHTTPLiveURL(const char *url) {
185afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (!strncasecmp("http://", url, 7)
186997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber            || !strncasecmp("https://", url, 8)
187997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber            || !strncasecmp("file://", url, 7)) {
188afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        size_t len = strlen(url);
189afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) {
190afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            return true;
191afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
192afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
193afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (strstr(url,"m3u8")) {
194afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            return true;
195afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
196afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
197afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
198afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return false;
199afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
200afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
2019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::setDataSourceAsync(
2021b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const sp<IMediaHTTPService> &httpService,
2031b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const char *url,
2041b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const KeyedVector<String8, String8> *headers) {
2055bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
2067a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    size_t len = strlen(url);
207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
208b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    sp<AMessage> notify = new AMessage(kWhatSourceNotify, id());
209b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
210afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<Source> source;
211afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (IsHTTPLiveURL(url)) {
21281e68448f3361eaf8618930471fdc3c21bdf5cbcAndreas Huber        source = new HTTPLiveSource(notify, httpService, url, headers);
213afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    } else if (!strncasecmp(url, "rtsp://", 7)) {
2141b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        source = new RTSPSource(
2151b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                notify, httpService, url, headers, mUIDValid, mUID);
2167a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    } else if ((!strncasecmp(url, "http://", 7)
2177a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                || !strncasecmp(url, "https://", 8))
2187a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                    && ((len >= 4 && !strcasecmp(".sdp", &url[len - 4]))
2197a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                    || strstr(url, ".sdp?"))) {
2201b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        source = new RTSPSource(
2211b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                notify, httpService, url, headers, mUIDValid, mUID, true);
2222bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    } else {
22381e68448f3361eaf8618930471fdc3c21bdf5cbcAndreas Huber        source = new GenericSource(notify, httpService, url, headers);
2242bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
2252bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
226afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    msg->setObject("source", source);
227afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    msg->post();
228afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
229afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
2309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::setDataSourceAsync(int fd, int64_t offset, int64_t length) {
231afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
232afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
233b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    sp<AMessage> notify = new AMessage(kWhatSourceNotify, id());
234b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
235b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    sp<Source> source = new GenericSource(notify, fd, offset, length);
236afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    msg->setObject("source", source);
237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::prepareAsync() {
2419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    (new AMessage(kWhatPrepare, id()))->post();
2429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
2439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
24457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Hubervoid NuPlayer::setVideoSurfaceTextureAsync(
2458ba01021b573889802e67e029225a96f0dfa471aAndy McFadden        const sp<IGraphicBufferProducer> &bufferProducer) {
2461173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id());
24757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
2488ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    if (bufferProducer == NULL) {
24957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber        msg->setObject("native-window", NULL);
25057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    } else {
25157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber        msg->setObject(
25257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber                "native-window",
25357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber                new NativeWindowWrapper(
2541a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian                    new Surface(bufferProducer)));
25557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    }
25657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
260f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) {
261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id());
262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setObject("sink", sink);
263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
266f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() {
267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    (new AMessage(kWhatStart, id()))->post();
268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
27043c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() {
271b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    (new AMessage(kWhatPause, id()))->post();
27243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
27343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
27443c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() {
275b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    (new AMessage(kWhatResume, id()))->post();
27643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
27743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
2781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() {
2791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (new AMessage(kWhatReset, id()))->post();
2801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
2811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
28243c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) {
28343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSeek, id());
28443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->setInt64("seekTimeUs", seekTimeUs);
28543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->post();
28643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
28743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
28853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static
2891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) {
29053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    switch (state) {
29153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        case FLUSHING_DECODER:
2921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
2931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = false;
29453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
29553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
29653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
2971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case FLUSHING_DECODER_SHUTDOWN:
2981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
2991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = true;
30053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
30153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
30253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
30353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        default:
30453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return false;
30553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    }
30653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber}
30753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
308f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetDataSource:
311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
3123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSetDataSource");
313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(mSource == NULL);
315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3165bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            sp<RefBase> obj;
3175bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            CHECK(msg->findObject("source", &obj));
318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3195bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource = static_cast<Source *>(obj.get());
320b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
321b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber            looper()->registerHandler(mSource);
3229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
3239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            CHECK(mDriver != NULL);
3249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            sp<NuPlayerDriver> driver = mDriver.promote();
3259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            if (driver != NULL) {
3269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber                driver->notifySetDataSourceCompleted(OK);
3279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            }
3289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            break;
3299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        }
3309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
3319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case kWhatPrepare:
3329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        {
3339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            mSource->prepareAsync();
334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
337dcb89b3b505522efde173c105a851c412f947178Chong Zhang        case kWhatGetTrackInfo:
338dcb89b3b505522efde173c105a851c412f947178Chong Zhang        {
339dcb89b3b505522efde173c105a851c412f947178Chong Zhang            uint32_t replyID;
340dcb89b3b505522efde173c105a851c412f947178Chong Zhang            CHECK(msg->senderAwaitsResponse(&replyID));
341dcb89b3b505522efde173c105a851c412f947178Chong Zhang
342dcb89b3b505522efde173c105a851c412f947178Chong Zhang            status_t err = INVALID_OPERATION;
343dcb89b3b505522efde173c105a851c412f947178Chong Zhang            if (mSource != NULL) {
344dcb89b3b505522efde173c105a851c412f947178Chong Zhang                Parcel* reply;
345dcb89b3b505522efde173c105a851c412f947178Chong Zhang                CHECK(msg->findPointer("reply", (void**)&reply));
346dcb89b3b505522efde173c105a851c412f947178Chong Zhang                err = mSource->getTrackInfo(reply);
347dcb89b3b505522efde173c105a851c412f947178Chong Zhang            }
348dcb89b3b505522efde173c105a851c412f947178Chong Zhang
349dcb89b3b505522efde173c105a851c412f947178Chong Zhang            sp<AMessage> response = new AMessage;
350dcb89b3b505522efde173c105a851c412f947178Chong Zhang            response->setInt32("err", err);
351dcb89b3b505522efde173c105a851c412f947178Chong Zhang
352dcb89b3b505522efde173c105a851c412f947178Chong Zhang            response->postReply(replyID);
353dcb89b3b505522efde173c105a851c412f947178Chong Zhang            break;
354dcb89b3b505522efde173c105a851c412f947178Chong Zhang        }
355dcb89b3b505522efde173c105a851c412f947178Chong Zhang
356dcb89b3b505522efde173c105a851c412f947178Chong Zhang        case kWhatSelectTrack:
357dcb89b3b505522efde173c105a851c412f947178Chong Zhang        {
358dcb89b3b505522efde173c105a851c412f947178Chong Zhang            uint32_t replyID;
359dcb89b3b505522efde173c105a851c412f947178Chong Zhang            CHECK(msg->senderAwaitsResponse(&replyID));
360dcb89b3b505522efde173c105a851c412f947178Chong Zhang
361dcb89b3b505522efde173c105a851c412f947178Chong Zhang            status_t err = INVALID_OPERATION;
362dcb89b3b505522efde173c105a851c412f947178Chong Zhang            if (mSource != NULL) {
363dcb89b3b505522efde173c105a851c412f947178Chong Zhang                size_t trackIndex;
364dcb89b3b505522efde173c105a851c412f947178Chong Zhang                int32_t select;
365dcb89b3b505522efde173c105a851c412f947178Chong Zhang                CHECK(msg->findSize("trackIndex", &trackIndex));
366dcb89b3b505522efde173c105a851c412f947178Chong Zhang                CHECK(msg->findInt32("select", &select));
367dcb89b3b505522efde173c105a851c412f947178Chong Zhang                err = mSource->selectTrack(trackIndex, select);
368dcb89b3b505522efde173c105a851c412f947178Chong Zhang            }
369dcb89b3b505522efde173c105a851c412f947178Chong Zhang
370dcb89b3b505522efde173c105a851c412f947178Chong Zhang            sp<AMessage> response = new AMessage;
371dcb89b3b505522efde173c105a851c412f947178Chong Zhang            response->setInt32("err", err);
372dcb89b3b505522efde173c105a851c412f947178Chong Zhang
373dcb89b3b505522efde173c105a851c412f947178Chong Zhang            response->postReply(replyID);
374dcb89b3b505522efde173c105a851c412f947178Chong Zhang            break;
375dcb89b3b505522efde173c105a851c412f947178Chong Zhang        }
376dcb89b3b505522efde173c105a851c412f947178Chong Zhang
377b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber        case kWhatPollDuration:
378b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber        {
379b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            int32_t generation;
380b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            CHECK(msg->findInt32("generation", &generation));
381b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
382b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            if (generation != mPollDurationGeneration) {
383b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                // stale
384b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                break;
385b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            }
386b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
387b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            int64_t durationUs;
388b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) {
389b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                sp<NuPlayerDriver> driver = mDriver.promote();
390b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                if (driver != NULL) {
391b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                    driver->notifyDuration(durationUs);
392b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                }
393b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            }
394b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
395b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            msg->post(1000000ll);  // poll again in a second.
396b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            break;
397b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber        }
398b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
3991173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        case kWhatSetVideoNativeWindow:
400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
4013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSetVideoNativeWindow");
402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
40357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber            mDeferredActions.push_back(
40414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber                    new ShutdownDecoderAction(
40514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber                        false /* audio */, true /* video */));
40657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
4081173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            CHECK(msg->findObject("native-window", &obj));
409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
41057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber            mDeferredActions.push_back(
41157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber                    new SetSurfaceAction(
41257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber                        static_cast<NativeWindowWrapper *>(obj.get())));
41357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
41457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber            if (obj != NULL) {
41557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber                // If there is a new surface texture, instantiate decoders
41657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber                // again if possible.
41757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber                mDeferredActions.push_back(
41857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber                        new SimpleAction(&NuPlayer::performScanSources));
41957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber            }
4200d268a3cae145afb2720c88ae38fb81550be5584James Dong
42157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber            processDeferredActions();
422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetAudioSink:
426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
4273856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSetAudioSink");
428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findObject("sink", &obj));
431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get());
433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatStart:
437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
4383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatStart");
43943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
4403fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mVideoIsAVC = false;
4411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mAudioEOS = false;
4421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mVideoEOS = false;
44332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            mSkipRenderingAudioUntilMediaTimeUs = -1;
44432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            mSkipRenderingVideoUntilMediaTimeUs = -1;
4453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mVideoLateByUs = 0;
4463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mNumFramesTotal = 0;
4473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mNumFramesDropped = 0;
44857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber            mStarted = true;
4491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4505bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource->start();
451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
452d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber            uint32_t flags = 0;
453d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
454d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber            if (mSource->isRealTime()) {
455d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber                flags |= Renderer::FLAG_REAL_TIME;
456d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber            }
457d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mRenderer = new Renderer(
459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioSink,
460d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber                    new AMessage(kWhatRendererNotify, id()),
461d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber                    flags);
462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            looper()->registerHandler(mRenderer);
464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            postScanSources();
466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatScanSources:
470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
4711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            int32_t generation;
4721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            CHECK(msg->findInt32("generation", &generation));
4731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (generation != mScanSourcesGeneration) {
4741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // Drop obsolete msg.
4751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
4761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4785bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mScanSourcesPending = false;
4795bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
4803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("scanning sources haveAudio=%d, haveVideo=%d",
48143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 mAudioDecoder != NULL, mVideoDecoder != NULL);
48243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
483b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            bool mHadAnySourcesBefore =
484b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                (mAudioDecoder != NULL) || (mVideoDecoder != NULL);
485b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
4865d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George            if (mNativeWindow != NULL) {
4875d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George                instantiateDecoder(false, &mVideoDecoder);
4885d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George            }
489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioSink != NULL) {
4915bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                instantiateDecoder(true, &mAudioDecoder);
492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
494b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            if (!mHadAnySourcesBefore
495b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                    && (mAudioDecoder != NULL || mVideoDecoder != NULL)) {
496b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                // This is the first time we've found anything playable.
497b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
4989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber                if (mSourceFlags & Source::FLAG_DYNAMIC_DURATION) {
499b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                    schedulePollDuration();
500b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                }
501b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            }
502b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
503eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber            status_t err;
504eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber            if ((err = mSource->feedMoreTSData()) != OK) {
5051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
5061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // We're not currently decoding anything (no audio or
5071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // video tracks found) and we just ran out of input data.
508eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber
509eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    if (err == ERROR_END_OF_STREAM) {
510eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                        notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
511eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    } else {
512eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                        notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
513eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    }
5141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                }
515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
518fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber            if ((mAudioDecoder == NULL && mAudioSink != NULL)
519fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber                    || (mVideoDecoder == NULL && mNativeWindow != NULL)) {
520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->post(100000ll);
5215bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                mScanSourcesPending = true;
522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatVideoNotify:
527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatAudioNotify:
528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            bool audio = msg->what() == kWhatAudioNotify;
530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
5321cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar            CHECK(msg->findInt32("what", &what));
533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5341cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar            if (what == Decoder::kWhatFillThisBuffer) {
535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                status_t err = feedDecoderInputData(
5361cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar                        audio, msg);
537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5385bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                if (err == -EWOULDBLOCK) {
539eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    if (mSource->feedMoreTSData() == OK) {
5401183a4ab06b9fe01fe39a4b8728bfc71789361fcAndreas Huber                        msg->post(10000ll);
5415bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                    }
542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
5431cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar            } else if (what == Decoder::kWhatEOS) {
544dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                int32_t err;
5451cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar                CHECK(msg->findInt32("err", &err));
546dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber
547dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                if (err == ERROR_END_OF_STREAM) {
5483856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("got %s decoder EOS", audio ? "audio" : "video");
549dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                } else {
5503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("got %s decoder EOS w/ error %d",
551dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                         audio ? "audio" : "video",
552dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                         err);
553dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                }
554dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber
555dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                mRenderer->queueEOS(audio, err);
5561cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar            } else if (what == Decoder::kWhatFlushCompleted) {
5571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                bool needShutdown;
55853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
5601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingAudio, &needShutdown));
561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingAudio = FLUSHED;
562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
5631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingVideo, &needShutdown));
564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingVideo = FLUSHED;
5653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
5663fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mVideoLateByUs = 0;
567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("decoder %s flush completed", audio ? "audio" : "video");
570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (needShutdown) {
5723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("initiating %s decoder shutdown",
57353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                         audio ? "audio" : "video");
574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
57553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown();
576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
57753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    if (audio) {
57853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingAudio = SHUTTING_DOWN_DECODER;
57953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    } else {
58053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingVideo = SHUTTING_DOWN_DECODER;
58153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    }
582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
5833831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
5843831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
5851cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar            } else if (what == Decoder::kWhatOutputFormatChanged) {
5861cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar                sp<AMessage> format;
5871cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar                CHECK(msg->findMessage("format", &format));
5881cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar
58931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                if (audio) {
59031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t numChannels;
5911cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar                    CHECK(format->findInt32(
592516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                                "channel-count", &numChannels));
5932c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
59431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t sampleRate;
5951cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar                    CHECK(format->findInt32("sample-rate", &sampleRate));
5962c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
5973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("Audio output format changed to %d Hz, %d channels",
59831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         sampleRate, numChannels);
5992c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
60031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->close();
6011948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent
6021948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    audio_output_flags_t flags;
6031948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    int64_t durationUs;
604516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    // FIXME: we should handle the case where the video decoder
605516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    // is created after we receive the format change indication.
606516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    // Current code will just make that we select deep buffer
607516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    // with video which should not be a problem as it should
6081948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    // not prevent from keeping A/V sync.
6091948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    if (mVideoDecoder == NULL &&
6101948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                            mSource->getDuration(&durationUs) == OK &&
611516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                            durationUs
612516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                                > AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US) {
6131948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                        flags = AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
6141948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    } else {
6151948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                        flags = AUDIO_OUTPUT_FLAG_NONE;
6161948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    }
6171948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent
6189806555d3930be43e11106281dee354820ac1c88Andreas Huber                    int32_t channelMask;
6191cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar                    if (!format->findInt32("channel-mask", &channelMask)) {
6209806555d3930be43e11106281dee354820ac1c88Andreas Huber                        channelMask = CHANNEL_MASK_USE_CHANNEL_ORDER;
6219806555d3930be43e11106281dee354820ac1c88Andreas Huber                    }
6229806555d3930be43e11106281dee354820ac1c88Andreas Huber
623078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                    CHECK_EQ(mAudioSink->open(
624078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                sampleRate,
625078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                numChannels,
6269806555d3930be43e11106281dee354820ac1c88Andreas Huber                                (audio_channel_mask_t)channelMask,
627078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                AUDIO_FORMAT_PCM_16_BIT,
6281948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                                8 /* bufferCount */,
6291948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                                NULL,
6301948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                                NULL,
6311948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                                flags),
632078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                             (status_t)OK);
63331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->start();
6343831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
63531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mRenderer->signalAudioSinkChanged();
63631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                } else {
63731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    // video
63831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
63931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t width, height;
6401cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar                    CHECK(format->findInt32("width", &width));
6411cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar                    CHECK(format->findInt32("height", &height));
64231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
64331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t cropLeft, cropTop, cropRight, cropBottom;
6441cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar                    CHECK(format->findRect(
64531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                "crop",
64631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                &cropLeft, &cropTop, &cropRight, &cropBottom));
64731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
648516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    int32_t displayWidth = cropRight - cropLeft + 1;
649516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    int32_t displayHeight = cropBottom - cropTop + 1;
650516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber
6513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("Video output format changed to %d x %d "
652cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         "(crop: %d x %d @ (%d, %d))",
65331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         width, height,
654516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                         displayWidth,
655516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                         displayHeight,
656cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         cropLeft, cropTop);
65731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
658516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    sp<AMessage> videoInputFormat =
659516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                        mSource->getFormat(false /* audio */);
660516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber
661516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    // Take into account sample aspect ratio if necessary:
662516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    int32_t sarWidth, sarHeight;
663516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    if (videoInputFormat->findInt32("sar-width", &sarWidth)
664516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                            && videoInputFormat->findInt32(
665516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                                "sar-height", &sarHeight)) {
666516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                        ALOGV("Sample aspect ratio %d : %d",
667516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                              sarWidth, sarHeight);
668516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber
669516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                        displayWidth = (displayWidth * sarWidth) / sarHeight;
670516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber
671516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                        ALOGV("display dimensions %d x %d",
672516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                              displayWidth, displayHeight);
673516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                    }
674516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber
67531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    notifyListener(
676516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber                            MEDIA_SET_VIDEO_SIZE, displayWidth, displayHeight);
67731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                }
6781cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar            } else if (what == Decoder::kWhatShutdownCompleted) {
6793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("%s shutdown completed", audio ? "audio" : "video");
6803831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                if (audio) {
6813831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mAudioDecoder.clear();
6823831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
6833831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER);
6843831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingAudio = SHUT_DOWN;
6853831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                } else {
6863831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mVideoDecoder.clear();
6873831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
6883831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER);
6893831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingVideo = SHUT_DOWN;
6903831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                }
6913831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
6923831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
6931cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar            } else if (what == Decoder::kWhatError) {
69429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("Received error from %s decoder, aborting playback.",
695c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                     audio ? "audio" : "video");
696c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
697c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                mRenderer->queueEOS(audio, UNKNOWN_ERROR);
6981cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar            } else if (what == Decoder::kWhatDrainThisBuffer) {
6991cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar                renderBuffer(audio, msg);
7001cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar            } else {
7011cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar                ALOGV("Unhandled decoder notification %d '%c%c%c%c'.",
702a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                      what,
703a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                      what >> 24,
704a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                      (what >> 16) & 0xff,
705a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                      (what >> 8) & 0xff,
706a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                      what & 0xff);
707f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
708f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
709f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatRendererNotify:
713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("what", &what));
716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == Renderer::kWhatEOS) {
718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
721c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                int32_t finalResult;
722c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                CHECK(msg->findInt32("finalResult", &finalResult));
723c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioEOS = true;
726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mVideoEOS = true;
728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
730c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                if (finalResult == ERROR_END_OF_STREAM) {
7313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("reached %s EOS", audio ? "audio" : "video");
732c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                } else {
73329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                    ALOGE("%s track encountered an error (%d)",
734c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                         audio ? "audio" : "video", finalResult);
735c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
736c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                    notifyListener(
737c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                            MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult);
738c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                }
739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if ((mAudioEOS || mAudioDecoder == NULL)
741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        && (mVideoEOS || mVideoDecoder == NULL)) {
742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
74443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            } else if (what == Renderer::kWhatPosition) {
74543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                int64_t positionUs;
74643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                CHECK(msg->findInt64("positionUs", &positionUs));
74743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
7483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                CHECK(msg->findInt64("videoLateByUs", &mVideoLateByUs));
7493fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
75043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (mDriver != NULL) {
75143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    sp<NuPlayerDriver> driver = mDriver.promote();
75243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    if (driver != NULL) {
75343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                        driver->notifyPosition(positionUs);
7543fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
7553fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        driver->notifyFrameStats(
7563fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                                mNumFramesTotal, mNumFramesDropped);
75743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    }
75843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
7593fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            } else if (what == Renderer::kWhatFlushComplete) {
760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7633856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("renderer %s flush completed.", audio ? "audio" : "video");
764f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong            } else if (what == Renderer::kWhatVideoRenderingStart) {
765f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong                notifyListener(MEDIA_INFO, MEDIA_INFO_RENDERING_START, 0);
766cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar            } else if (what == Renderer::kWhatMediaRenderingStart) {
767cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar                ALOGV("media rendering started");
768cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar                notifyListener(MEDIA_STARTED, 0, 0);
769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
770f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
771f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
773f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatMoreDataQueued:
774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
775f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case kWhatReset:
7791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        {
7803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatReset");
7811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
782a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            mDeferredActions.push_back(
78314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber                    new ShutdownDecoderAction(
78414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber                        true /* audio */, true /* video */));
785b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber
786a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            mDeferredActions.push_back(
787a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                    new SimpleAction(&NuPlayer::performReset));
7881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
789a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            processDeferredActions();
7901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            break;
7911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
7921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
79343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        case kWhatSeek:
79443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        {
79543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            int64_t seekTimeUs;
79643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
79743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
798a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            ALOGV("kWhatSeek seekTimeUs=%lld us", seekTimeUs);
79943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
800a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            mDeferredActions.push_back(
801a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                    new SimpleAction(&NuPlayer::performDecoderFlush));
80243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
803a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            mDeferredActions.push_back(new SeekAction(seekTimeUs));
80443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
805a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            processDeferredActions();
80643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            break;
80743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
80843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
809b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatPause:
810b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
811b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
812fba60daf77cc74a13ae3bf4b0e9925dd2ee4470cRoger Jönsson            mSource->pause();
813b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->pause();
814b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
815b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
816b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
817b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatResume:
818b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
819b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
820fba60daf77cc74a13ae3bf4b0e9925dd2ee4470cRoger Jönsson            mSource->resume();
821b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->resume();
822b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
823b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
824b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
825b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber        case kWhatSourceNotify:
826b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber        {
8279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            onSourceNotify(msg);
828b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber            break;
829b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber        }
830b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
832f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            TRESPASS();
833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
834f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
835f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
836f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8373831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() {
8383831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) {
8393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
8403831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
8413831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
8423831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) {
8433831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
8443831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
8453831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
8463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("both audio and video are flushed now.");
8473831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
8486e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (mTimeDiscontinuityPending) {
8496e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        mRenderer->signalTimeDiscontinuity();
8506e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        mTimeDiscontinuityPending = false;
8516e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
8523831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
85322fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mAudioDecoder != NULL) {
8543831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mAudioDecoder->signalResume();
8553831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
8563831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
85722fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mVideoDecoder != NULL) {
8583831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mVideoDecoder->signalResume();
8593831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
8603831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
8613831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingAudio = NONE;
8623831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingVideo = NONE;
863f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
864a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    processDeferredActions();
8651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
8661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() {
8681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mScanSourcesPending) {
8691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        return;
870f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
8711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    sp<AMessage> msg = new AMessage(kWhatScanSources, id());
8731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->setInt32("generation", mScanSourcesGeneration);
8741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->post();
8751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mScanSourcesPending = true;
877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8795bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) {
880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (*decoder != NULL) {
881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
884840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    sp<AMessage> format = mSource->getFormat(audio);
885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
886840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    if (format == NULL) {
887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return -EWOULDBLOCK;
888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8903fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    if (!audio) {
891840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        AString mime;
892840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        CHECK(format->findString("mime", &mime));
893840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime.c_str());
8943fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    }
8953fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notify =
897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify,
898f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     id());
899f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
9001173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    *decoder = audio ? new Decoder(notify) :
9011173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                       new Decoder(notify, mNativeWindow);
9021cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar    (*decoder)->init();
903840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    (*decoder)->configure(format);
904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
905f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
907f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
908f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
909f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
910f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
911f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
91253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    if ((audio && IsFlushingState(mFlushingAudio))
91353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            || (!audio && IsFlushingState(mFlushingVideo))) {
914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->setInt32("err", INFO_DISCONTINUITY);
915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->post();
916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
917f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
919f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> accessUnit;
920f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
9213fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    bool dropAccessUnit;
9223fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    do {
9233fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        status_t err = mSource->dequeueAccessUnit(audio, &accessUnit);
9245bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
9253fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (err == -EWOULDBLOCK) {
9263fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            return err;
9273fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        } else if (err != OK) {
9283fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            if (err == INFO_DISCONTINUITY) {
9293fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                int32_t type;
9303fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                CHECK(accessUnit->meta()->findInt32("discontinuity", &type));
93153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
9323fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                bool formatChange =
9336e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    (audio &&
9346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                     (type & ATSParser::DISCONTINUITY_AUDIO_FORMAT))
9356e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    || (!audio &&
9366e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            (type & ATSParser::DISCONTINUITY_VIDEO_FORMAT));
93753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
9386e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                bool timeChange = (type & ATSParser::DISCONTINUITY_TIME) != 0;
9396e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
940df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block                ALOGI("%s discontinuity (formatChange=%d, time=%d)",
9416e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                     audio ? "audio" : "video", formatChange, timeChange);
94232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
9433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                if (audio) {
9443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mSkipRenderingAudioUntilMediaTimeUs = -1;
9453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                } else {
9463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mSkipRenderingVideoUntilMediaTimeUs = -1;
9473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                }
94832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
9496e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                if (timeChange) {
9506e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    sp<AMessage> extra;
9516e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    if (accessUnit->meta()->findMessage("extra", &extra)
9526e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            && extra != NULL) {
9536e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        int64_t resumeAtMediaTimeUs;
9546e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        if (extra->findInt64(
9556e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) {
956df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block                            ALOGI("suppressing rendering of %s until %lld us",
9576e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    audio ? "audio" : "video", resumeAtMediaTimeUs);
9586e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
9596e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            if (audio) {
9606e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                mSkipRenderingAudioUntilMediaTimeUs =
9616e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    resumeAtMediaTimeUs;
9626e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            } else {
9636e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                mSkipRenderingVideoUntilMediaTimeUs =
9646e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    resumeAtMediaTimeUs;
9656e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            }
9663fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        }
96732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                    }
96832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                }
9693fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
9706e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                mTimeDiscontinuityPending =
9716e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    mTimeDiscontinuityPending || timeChange;
9726e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
9736e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                if (formatChange || timeChange) {
974a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                    if (mFlushingAudio == NONE && mFlushingVideo == NONE) {
975a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                        // And we'll resume scanning sources once we're done
976a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                        // flushing.
977a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                        mDeferredActions.push_front(
978a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                                new SimpleAction(
979a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                                    &NuPlayer::performScanSources));
980a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                    }
981a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
9826d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih                    sp<AMessage> newFormat = mSource->getFormat(audio);
9836d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih                    sp<Decoder> &decoder = audio ? mAudioDecoder : mVideoDecoder;
9846d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih                    if (formatChange && !decoder->supportsSeamlessFormatChange(newFormat)) {
9856d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih                        flushDecoder(audio, /* needShutdown = */ true);
9866d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih                    } else {
9876d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih                        flushDecoder(audio, /* needShutdown = */ false);
9886d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih                        err = OK;
9896d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih                    }
9906e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                } else {
9916e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    // This stream is unaffected by the discontinuity
9926e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
9936e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    if (audio) {
9946e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        mFlushingAudio = FLUSHED;
9956e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    } else {
9966e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        mFlushingVideo = FLUSHED;
9976e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    }
9986e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
9996e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    finishFlushIfPossible();
10006e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
10016e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    return -EWOULDBLOCK;
10026e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                }
100332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            }
100432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
10053fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            reply->setInt32("err", err);
10063fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            reply->post();
10073fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            return OK;
1008f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1009f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
10103fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (!audio) {
10113fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            ++mNumFramesTotal;
10123fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        }
10133fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
10143fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        dropAccessUnit = false;
10153fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (!audio
10163fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && mVideoLateByUs > 100000ll
10173fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && mVideoIsAVC
10183fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && !IsAVCReferenceFrame(accessUnit)) {
10193fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            dropAccessUnit = true;
10203fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            ++mNumFramesDropped;
10213fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        }
10223fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    } while (dropAccessUnit);
1023f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
10243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    // ALOGV("returned a valid buffer of %s data", audio ? "audio" : "video");
1025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0
1027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t mediaTimeUs;
1028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs));
10293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("feeding %s input buffer at media time %.2f secs",
1030f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         audio ? "audio" : "video",
1031f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         mediaTimeUs / 1E6);
1032f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif
1033f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
10342d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    reply->setBuffer("buffer", accessUnit);
1035f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->post();
1036f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1037f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
1038f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1039f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1040f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) {
10413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    // ALOGV("renderBuffer %s", audio ? "audio" : "video");
1042f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1043f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
1044f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
1045f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
104618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) {
104718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // We're currently attempting to flush the decoder, in order
104818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // to complete this, the decoder wants all its buffers back,
104918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // so we don't want any output buffers it sent us (from before
105018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // we initiated the flush) to be stuck in the renderer's queue.
105118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
10523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("we're still flushing the %s decoder, sending its output buffer"
105318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber             " right back.", audio ? "audio" : "video");
105418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
105518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        reply->post();
105618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        return;
105718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
105818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
10592d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    sp<ABuffer> buffer;
10602d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    CHECK(msg->findBuffer("buffer", &buffer));
1061f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
106232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    int64_t &skipUntilMediaTimeUs =
106332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        audio
106432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            ? mSkipRenderingAudioUntilMediaTimeUs
106532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            : mSkipRenderingVideoUntilMediaTimeUs;
106632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
106732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    if (skipUntilMediaTimeUs >= 0) {
106832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        int64_t mediaTimeUs;
106932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs));
107032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
107132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        if (mediaTimeUs < skipUntilMediaTimeUs) {
10723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("dropping %s buffer at time %lld as requested.",
107332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 audio ? "audio" : "video",
107432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 mediaTimeUs);
107532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
107632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            reply->post();
107732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            return;
107832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        }
107932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
108032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        skipUntilMediaTimeUs = -1;
108132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    }
108232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
1083f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mRenderer->queueBuffer(audio, buffer, reply);
1084f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1085f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1086dcb89b3b505522efde173c105a851c412f947178Chong Zhangvoid NuPlayer::notifyListener(int msg, int ext1, int ext2, const Parcel *in) {
108743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver == NULL) {
1088f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
1089f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1090f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
109143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<NuPlayerDriver> driver = mDriver.promote();
1092f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
109343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (driver == NULL) {
1094f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
1095f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1096f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1097dcb89b3b505522efde173c105a851c412f947178Chong Zhang    driver->notifyListener(msg, ext1, ext2, in);
1098f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1099f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
11001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) {
110114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    ALOGV("[%s] flushDecoder needShutdown=%d",
110214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber          audio ? "audio" : "video", needShutdown);
110314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
11046e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if ((audio && mAudioDecoder == NULL) || (!audio && mVideoDecoder == NULL)) {
1105df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("flushDecoder %s without decoder present",
11066e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber             audio ? "audio" : "video");
11076e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
11086e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
11091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    // Make sure we don't continue to scan sources until we finish flushing.
11101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    ++mScanSourcesGeneration;
111143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mScanSourcesPending = false;
11121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
11131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (audio ? mAudioDecoder : mVideoDecoder)->signalFlush();
11141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer->flush(audio);
11151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
11161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    FlushStatus newStatus =
11171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER;
11181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
11191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (audio) {
11201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingAudio == NONE
11211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingAudio == AWAITING_DISCONTINUITY);
11221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
11231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingAudio = newStatus;
11241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
11251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingVideo == NONE) {
11261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingVideo = (mVideoDecoder != NULL)
11271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
11281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
11291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
11301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else {
11311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingVideo == NONE
11321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingVideo == AWAITING_DISCONTINUITY);
11331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
11341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingVideo = newStatus;
11351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
11361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingAudio == NONE) {
11371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingAudio = (mAudioDecoder != NULL)
11381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
11391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
11401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
11411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
11421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
11431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
1144840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Hubersp<AMessage> NuPlayer::Source::getFormat(bool audio) {
1145840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    sp<MetaData> meta = getFormatMeta(audio);
1146840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
1147840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    if (meta == NULL) {
1148840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        return NULL;
1149840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    }
1150840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
1151840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    sp<AMessage> msg = new AMessage;
1152840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
1153840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    if(convertMetaDataToMessage(meta, &msg) == OK) {
1154840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        return msg;
1155840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    }
1156840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    return NULL;
1157840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber}
1158840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
11590d268a3cae145afb2720c88ae38fb81550be5584James Dongstatus_t NuPlayer::setVideoScalingMode(int32_t mode) {
11600d268a3cae145afb2720c88ae38fb81550be5584James Dong    mVideoScalingMode = mode;
116157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    if (mNativeWindow != NULL) {
11620d268a3cae145afb2720c88ae38fb81550be5584James Dong        status_t ret = native_window_set_scaling_mode(
11630d268a3cae145afb2720c88ae38fb81550be5584James Dong                mNativeWindow->getNativeWindow().get(), mVideoScalingMode);
11640d268a3cae145afb2720c88ae38fb81550be5584James Dong        if (ret != OK) {
11650d268a3cae145afb2720c88ae38fb81550be5584James Dong            ALOGE("Failed to set scaling mode (%d): %s",
11660d268a3cae145afb2720c88ae38fb81550be5584James Dong                -ret, strerror(-ret));
11670d268a3cae145afb2720c88ae38fb81550be5584James Dong            return ret;
11680d268a3cae145afb2720c88ae38fb81550be5584James Dong        }
11690d268a3cae145afb2720c88ae38fb81550be5584James Dong    }
11700d268a3cae145afb2720c88ae38fb81550be5584James Dong    return OK;
11710d268a3cae145afb2720c88ae38fb81550be5584James Dong}
11720d268a3cae145afb2720c88ae38fb81550be5584James Dong
1173dcb89b3b505522efde173c105a851c412f947178Chong Zhangstatus_t NuPlayer::getTrackInfo(Parcel* reply) const {
1174dcb89b3b505522efde173c105a851c412f947178Chong Zhang    sp<AMessage> msg = new AMessage(kWhatGetTrackInfo, id());
1175dcb89b3b505522efde173c105a851c412f947178Chong Zhang    msg->setPointer("reply", reply);
1176dcb89b3b505522efde173c105a851c412f947178Chong Zhang
1177dcb89b3b505522efde173c105a851c412f947178Chong Zhang    sp<AMessage> response;
1178dcb89b3b505522efde173c105a851c412f947178Chong Zhang    status_t err = msg->postAndAwaitResponse(&response);
1179dcb89b3b505522efde173c105a851c412f947178Chong Zhang    return err;
1180dcb89b3b505522efde173c105a851c412f947178Chong Zhang}
1181dcb89b3b505522efde173c105a851c412f947178Chong Zhang
1182dcb89b3b505522efde173c105a851c412f947178Chong Zhangstatus_t NuPlayer::selectTrack(size_t trackIndex, bool select) {
1183dcb89b3b505522efde173c105a851c412f947178Chong Zhang    sp<AMessage> msg = new AMessage(kWhatSelectTrack, id());
1184dcb89b3b505522efde173c105a851c412f947178Chong Zhang    msg->setSize("trackIndex", trackIndex);
1185dcb89b3b505522efde173c105a851c412f947178Chong Zhang    msg->setInt32("select", select);
1186dcb89b3b505522efde173c105a851c412f947178Chong Zhang
1187dcb89b3b505522efde173c105a851c412f947178Chong Zhang    sp<AMessage> response;
1188dcb89b3b505522efde173c105a851c412f947178Chong Zhang    status_t err = msg->postAndAwaitResponse(&response);
1189dcb89b3b505522efde173c105a851c412f947178Chong Zhang
1190dcb89b3b505522efde173c105a851c412f947178Chong Zhang    return err;
1191dcb89b3b505522efde173c105a851c412f947178Chong Zhang}
1192dcb89b3b505522efde173c105a851c412f947178Chong Zhang
1193b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Hubervoid NuPlayer::schedulePollDuration() {
1194b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    sp<AMessage> msg = new AMessage(kWhatPollDuration, id());
1195b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    msg->setInt32("generation", mPollDurationGeneration);
1196b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    msg->post();
1197b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber}
1198b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
1199b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Hubervoid NuPlayer::cancelPollDuration() {
1200b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    ++mPollDurationGeneration;
1201b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber}
1202b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
1203a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::processDeferredActions() {
1204a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    while (!mDeferredActions.empty()) {
1205a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        // We won't execute any deferred actions until we're no longer in
1206a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        // an intermediate state, i.e. one more more decoders are currently
1207a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        // flushing or shutting down.
1208a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1209a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        if (mRenderer != NULL) {
1210a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            // There's an edge case where the renderer owns all output
1211a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            // buffers and is paused, therefore the decoder will not read
1212a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            // more input data and will never encounter the matching
1213a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            // discontinuity. To avoid this, we resume the renderer.
1214a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1215a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            if (mFlushingAudio == AWAITING_DISCONTINUITY
1216a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                    || mFlushingVideo == AWAITING_DISCONTINUITY) {
1217a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                mRenderer->resume();
1218a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            }
1219a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        }
1220a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1221a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        if (mFlushingAudio != NONE || mFlushingVideo != NONE) {
1222a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            // We're currently flushing, postpone the reset until that's
1223a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            // completed.
1224a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1225a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            ALOGV("postponing action mFlushingAudio=%d, mFlushingVideo=%d",
1226a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber                  mFlushingAudio, mFlushingVideo);
1227a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1228a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            break;
1229a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        }
1230a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1231a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        sp<Action> action = *mDeferredActions.begin();
1232a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        mDeferredActions.erase(mDeferredActions.begin());
1233a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1234a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        action->execute(this);
1235a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1236a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber}
1237a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1238a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::performSeek(int64_t seekTimeUs) {
1239a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    ALOGV("performSeek seekTimeUs=%lld us (%.2f secs)",
1240a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber          seekTimeUs,
1241a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber          seekTimeUs / 1E6);
1242a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1243a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    mSource->seekTo(seekTimeUs);
1244a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1245a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    if (mDriver != NULL) {
1246a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
1247a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        if (driver != NULL) {
1248a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            driver->notifyPosition(seekTimeUs);
1249a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            driver->notifySeekComplete();
1250a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        }
1251a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1252a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1253a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    // everything's flushed, continue playback.
1254a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber}
1255a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1256a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::performDecoderFlush() {
1257a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    ALOGV("performDecoderFlush");
1258a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1259da9740e63a835e610519bd235be9137d74b6d409Andreas Huber    if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
1260a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        return;
1261a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1262a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1263a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    mTimeDiscontinuityPending = true;
1264a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1265a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    if (mAudioDecoder != NULL) {
1266a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        flushDecoder(true /* audio */, false /* needShutdown */);
1267a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1268a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1269a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    if (mVideoDecoder != NULL) {
1270a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        flushDecoder(false /* audio */, false /* needShutdown */);
1271a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1272a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber}
1273a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
127414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubervoid NuPlayer::performDecoderShutdown(bool audio, bool video) {
127514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    ALOGV("performDecoderShutdown audio=%d, video=%d", audio, video);
1276a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
127714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    if ((!audio || mAudioDecoder == NULL)
127814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            && (!video || mVideoDecoder == NULL)) {
1279a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        return;
1280a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1281a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1282a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    mTimeDiscontinuityPending = true;
1283a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
128414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    if (mFlushingAudio == NONE && (!audio || mAudioDecoder == NULL)) {
128514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        mFlushingAudio = FLUSHED;
128614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    }
128714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
128814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    if (mFlushingVideo == NONE && (!video || mVideoDecoder == NULL)) {
128914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        mFlushingVideo = FLUSHED;
129014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    }
129114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
129214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    if (audio && mAudioDecoder != NULL) {
1293a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        flushDecoder(true /* audio */, true /* needShutdown */);
1294a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1295a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
129614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    if (video && mVideoDecoder != NULL) {
1297a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        flushDecoder(false /* audio */, true /* needShutdown */);
1298a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1299a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber}
1300a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1301a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::performReset() {
1302a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    ALOGV("performReset");
1303a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1304a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    CHECK(mAudioDecoder == NULL);
1305a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    CHECK(mVideoDecoder == NULL);
1306a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1307a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    cancelPollDuration();
1308a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1309a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    ++mScanSourcesGeneration;
1310a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    mScanSourcesPending = false;
1311a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1312a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    mRenderer.clear();
1313a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1314a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    if (mSource != NULL) {
1315a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        mSource->stop();
1316b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
1317b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber        looper()->unregisterHandler(mSource->id());
1318b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
1319a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        mSource.clear();
1320a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1321a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1322a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    if (mDriver != NULL) {
1323a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
1324a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        if (driver != NULL) {
1325a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber            driver->notifyResetComplete();
1326a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        }
1327a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
132857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
132957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    mStarted = false;
1330a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber}
1331a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
1332a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::performScanSources() {
1333a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    ALOGV("performScanSources");
1334a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
133557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    if (!mStarted) {
133657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber        return;
133757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    }
133857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
1339a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
1340a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber        postScanSources();
1341a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber    }
1342a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber}
1343a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber
134457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Hubervoid NuPlayer::performSetSurface(const sp<NativeWindowWrapper> &wrapper) {
134557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    ALOGV("performSetSurface");
134657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
134757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    mNativeWindow = wrapper;
134857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
134957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    // XXX - ignore error from setVideoScalingMode for now
135057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    setVideoScalingMode(mVideoScalingMode);
135157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
135257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    if (mDriver != NULL) {
135357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
135457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber        if (driver != NULL) {
135557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber            driver->notifySetSurfaceComplete();
135657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber        }
135757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    }
135857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber}
135957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
13609575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::onSourceNotify(const sp<AMessage> &msg) {
13619575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    int32_t what;
13629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    CHECK(msg->findInt32("what", &what));
13639575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
13649575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    switch (what) {
13659575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case Source::kWhatPrepared:
13669575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        {
1367b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber            if (mSource == NULL) {
1368b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber                // This is a stale notification from a source that was
1369b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber                // asynchronously preparing when the client called reset().
1370b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber                // We handled the reset, the source is gone.
1371b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber                break;
1372b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber            }
1373b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber
1374ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber            int32_t err;
1375ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber            CHECK(msg->findInt32("err", &err));
1376ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber
13779575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            sp<NuPlayerDriver> driver = mDriver.promote();
13789575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            if (driver != NULL) {
1379dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen                // notify duration first, so that it's definitely set when
1380dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen                // the app received the "prepare complete" callback.
1381dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen                int64_t durationUs;
1382dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen                if (mSource->getDuration(&durationUs) == OK) {
1383997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber                    driver->notifyDuration(durationUs);
1384997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber                }
1385dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen                driver->notifyPrepareCompleted(err);
1386997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber            }
1387dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen
13889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            break;
13899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        }
13909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
13919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case Source::kWhatFlagsChanged:
13929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        {
13939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            uint32_t flags;
13949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            CHECK(msg->findInt32("flags", (int32_t *)&flags));
13959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
13964b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang            sp<NuPlayerDriver> driver = mDriver.promote();
13974b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang            if (driver != NULL) {
13984b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang                driver->notifyFlagsChanged(flags);
13994b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang            }
14004b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang
14019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            if ((mSourceFlags & Source::FLAG_DYNAMIC_DURATION)
14029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber                    && (!(flags & Source::FLAG_DYNAMIC_DURATION))) {
14039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber                cancelPollDuration();
14049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            } else if (!(mSourceFlags & Source::FLAG_DYNAMIC_DURATION)
14059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber                    && (flags & Source::FLAG_DYNAMIC_DURATION)
14069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber                    && (mAudioDecoder != NULL || mVideoDecoder != NULL)) {
14079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber                schedulePollDuration();
14089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            }
14099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
14109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            mSourceFlags = flags;
14119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            break;
14129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        }
14139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
14149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case Source::kWhatVideoSizeChanged:
14159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        {
14169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            int32_t width, height;
14179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            CHECK(msg->findInt32("width", &width));
14189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            CHECK(msg->findInt32("height", &height));
14199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
14209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            notifyListener(MEDIA_SET_VIDEO_SIZE, width, height);
14219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            break;
14229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        }
14239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1424b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson        case Source::kWhatBufferingStart:
1425b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson        {
1426b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson            notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_START, 0);
1427b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson            break;
1428b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson        }
1429b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson
1430b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson        case Source::kWhatBufferingEnd:
1431b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson        {
1432b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson            notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_END, 0);
1433b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson            break;
1434b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson        }
1435b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson
1436dcb89b3b505522efde173c105a851c412f947178Chong Zhang        case Source::kWhatSubtitleData:
1437dcb89b3b505522efde173c105a851c412f947178Chong Zhang        {
1438dcb89b3b505522efde173c105a851c412f947178Chong Zhang            sp<ABuffer> buffer;
1439dcb89b3b505522efde173c105a851c412f947178Chong Zhang            CHECK(msg->findBuffer("buffer", &buffer));
1440dcb89b3b505522efde173c105a851c412f947178Chong Zhang
1441dcb89b3b505522efde173c105a851c412f947178Chong Zhang            int32_t trackIndex;
1442dcb89b3b505522efde173c105a851c412f947178Chong Zhang            int64_t timeUs, durationUs;
1443dcb89b3b505522efde173c105a851c412f947178Chong Zhang            CHECK(buffer->meta()->findInt32("trackIndex", &trackIndex));
1444dcb89b3b505522efde173c105a851c412f947178Chong Zhang            CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
1445dcb89b3b505522efde173c105a851c412f947178Chong Zhang            CHECK(buffer->meta()->findInt64("durationUs", &durationUs));
1446dcb89b3b505522efde173c105a851c412f947178Chong Zhang
1447dcb89b3b505522efde173c105a851c412f947178Chong Zhang            Parcel in;
1448dcb89b3b505522efde173c105a851c412f947178Chong Zhang            in.writeInt32(trackIndex);
1449dcb89b3b505522efde173c105a851c412f947178Chong Zhang            in.writeInt64(timeUs);
1450dcb89b3b505522efde173c105a851c412f947178Chong Zhang            in.writeInt64(durationUs);
1451dcb89b3b505522efde173c105a851c412f947178Chong Zhang            in.writeInt32(buffer->size());
1452dcb89b3b505522efde173c105a851c412f947178Chong Zhang            in.writeInt32(buffer->size());
1453dcb89b3b505522efde173c105a851c412f947178Chong Zhang            in.write(buffer->data(), buffer->size());
1454dcb89b3b505522efde173c105a851c412f947178Chong Zhang
1455dcb89b3b505522efde173c105a851c412f947178Chong Zhang            notifyListener(MEDIA_SUBTITLE_DATA, 0, 0, &in);
1456dcb89b3b505522efde173c105a851c412f947178Chong Zhang            break;
1457dcb89b3b505522efde173c105a851c412f947178Chong Zhang        }
1458dcb89b3b505522efde173c105a851c412f947178Chong Zhang
145914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        case Source::kWhatQueueDecoderShutdown:
146014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        {
146114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            int32_t audio, video;
146214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            CHECK(msg->findInt32("audio", &audio));
146314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            CHECK(msg->findInt32("video", &video));
146414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
146514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            sp<AMessage> reply;
146614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            CHECK(msg->findMessage("reply", &reply));
146714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
146814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            queueDecoderShutdown(audio, video, reply);
146914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            break;
147014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        }
147114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
14729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        default:
14739575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            TRESPASS();
14749575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    }
14759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
14769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1477b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber////////////////////////////////////////////////////////////////////////////////
1478b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
14799575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::Source::notifyFlagsChanged(uint32_t flags) {
14809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    sp<AMessage> notify = dupNotify();
14819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notify->setInt32("what", kWhatFlagsChanged);
14829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notify->setInt32("flags", flags);
14839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notify->post();
14849575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
14859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
14869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::Source::notifyVideoSizeChanged(int32_t width, int32_t height) {
14879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    sp<AMessage> notify = dupNotify();
14889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notify->setInt32("what", kWhatVideoSizeChanged);
14899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notify->setInt32("width", width);
14909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notify->setInt32("height", height);
14919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notify->post();
14929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
14939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1494ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Hubervoid NuPlayer::Source::notifyPrepared(status_t err) {
14959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    sp<AMessage> notify = dupNotify();
14969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notify->setInt32("what", kWhatPrepared);
1497ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber    notify->setInt32("err", err);
14989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notify->post();
14999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
15009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
150184333e0475bc911adc16417f4ca327c975cf6c36Andreas Hubervoid NuPlayer::Source::onMessageReceived(const sp<AMessage> & /* msg */) {
1502b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    TRESPASS();
1503b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber}
1504b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
150514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubervoid NuPlayer::queueDecoderShutdown(
150614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        bool audio, bool video, const sp<AMessage> &reply) {
150714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    ALOGI("queueDecoderShutdown audio=%d, video=%d", audio, video);
150814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
150914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    mDeferredActions.push_back(
151014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            new ShutdownDecoderAction(audio, video));
151114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
151214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    mDeferredActions.push_back(
151314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            new SimpleAction(&NuPlayer::performScanSources));
151414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
151514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    mDeferredActions.push_back(new PostMessageAction(reply));
151614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
151714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    processDeferredActions();
151814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber}
151914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
1520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
1521