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"
31840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include "mp4/MP4Source.h"
325bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
335bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "ATSParser.h"
34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
35840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include <cutils/properties.h> // for property_get
363831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber#include <media/stagefright/foundation/hexdump.h>
37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h>
39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h>
40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h>
413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include <media/stagefright/MediaDefs.h>
42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h>
43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h>
441173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h>
45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include "avc_utils.h"
473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
48840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include "ESDS.h"
49840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include <media/stagefright/Utils.h>
50840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
51f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
55f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer()
569b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    : mUIDValid(false),
573fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mVideoIsAVC(false),
589b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber      mAudioEOS(false),
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mVideoEOS(false),
605bc087c573c70c84c6a39946457590b42d392a33Andreas Huber      mScanSourcesPending(false),
611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mScanSourcesGeneration(0),
62b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber      mPollDurationGeneration(0),
636e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber      mTimeDiscontinuityPending(false),
64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mFlushingAudio(NONE),
651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mFlushingVideo(NONE),
661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mResetInProgress(false),
673fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mResetPostponed(false),
683fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mSkipRenderingAudioUntilMediaTimeUs(-1ll),
693fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mSkipRenderingVideoUntilMediaTimeUs(-1ll),
703fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mVideoLateByUs(0ll),
713fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mNumFramesTotal(0ll),
720d268a3cae145afb2720c88ae38fb81550be5584James Dong      mNumFramesDropped(0ll),
730d268a3cae145afb2720c88ae38fb81550be5584James Dong      mVideoScalingMode(NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW) {
74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
76f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() {
77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
799b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid NuPlayer::setUID(uid_t uid) {
809b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUIDValid = true;
819b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUID = uid;
829b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber}
839b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
8443c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) {
8543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mDriver = driver;
86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
88f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) {
89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
91840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    char prop[PROPERTY_VALUE_MAX];
92840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    if (property_get("media.stagefright.use-mp4source", prop, NULL)
93840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            && (!strcmp(prop, "1") || !strcasecmp(prop, "true"))) {
94840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        msg->setObject("source", new MP4Source(source));
95840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    } else {
96840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        msg->setObject("source", new StreamingSource(source));
97840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    }
98840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
995bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->post();
1005bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
1015bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
102afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatic bool IsHTTPLiveURL(const char *url) {
103afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (!strncasecmp("http://", url, 7)
104afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            || !strncasecmp("https://", url, 8)) {
105afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        size_t len = strlen(url);
106afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) {
107afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            return true;
108afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
109afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
110afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (strstr(url,"m3u8")) {
111afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            return true;
112afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
113afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
114afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
115afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return false;
116afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
117afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
1185bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::setDataSource(
1195bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        const char *url, const KeyedVector<String8, String8> *headers) {
1205bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
122afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<Source> source;
123afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (IsHTTPLiveURL(url)) {
124afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        source = new HTTPLiveSource(url, headers, mUIDValid, mUID);
125afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    } else if (!strncasecmp(url, "rtsp://", 7)) {
126afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        source = new RTSPSource(url, headers, mUIDValid, mUID);
1272bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    } else {
128afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        source = new GenericSource(url, headers, mUIDValid, mUID);
1292bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1302bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
131afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    msg->setObject("source", source);
132afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    msg->post();
133afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
134afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
135afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Hubervoid NuPlayer::setDataSource(int fd, int64_t offset, int64_t length) {
136afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
137afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
138afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<Source> source = new GenericSource(fd, offset, length);
139afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    msg->setObject("source", source);
140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1431173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid NuPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
1441173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id());
1451173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ?
1461173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                new SurfaceTextureClient(surfaceTexture) : NULL);
1471173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    msg->setObject("native-window", new NativeWindowWrapper(surfaceTextureClient));
148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
151f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) {
152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id());
153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setObject("sink", sink);
154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
157f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() {
158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    (new AMessage(kWhatStart, id()))->post();
159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
16143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() {
162b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    (new AMessage(kWhatPause, id()))->post();
16343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
16443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
16543c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() {
166b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    (new AMessage(kWhatResume, id()))->post();
16743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
16843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
1691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() {
1701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (new AMessage(kWhatReset, id()))->post();
1711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
1721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
17343c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) {
17443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSeek, id());
17543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->setInt64("seekTimeUs", seekTimeUs);
17643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->post();
17743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
17843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
17953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static
1801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) {
18153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    switch (state) {
18253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        case FLUSHING_DECODER:
1831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
1841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = false;
18553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
18653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
18753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
1881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case FLUSHING_DECODER_SHUTDOWN:
1891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
1901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = true;
19153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
19253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
19353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
19453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        default:
19553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return false;
19653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    }
19753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber}
19853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
199f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetDataSource:
202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSetDataSource");
204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(mSource == NULL);
206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2075bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            sp<RefBase> obj;
2085bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            CHECK(msg->findObject("source", &obj));
209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource = static_cast<Source *>(obj.get());
211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
214b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber        case kWhatPollDuration:
215b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber        {
216b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            int32_t generation;
217b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            CHECK(msg->findInt32("generation", &generation));
218b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
219b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            if (generation != mPollDurationGeneration) {
220b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                // stale
221b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                break;
222b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            }
223b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
224b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            int64_t durationUs;
225b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) {
226b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                sp<NuPlayerDriver> driver = mDriver.promote();
227b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                if (driver != NULL) {
228b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                    driver->notifyDuration(durationUs);
229b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                }
230b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            }
231b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
232b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            msg->post(1000000ll);  // poll again in a second.
233b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            break;
234b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber        }
235b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
2361173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        case kWhatSetVideoNativeWindow:
237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSetVideoNativeWindow");
239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
2411173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            CHECK(msg->findObject("native-window", &obj));
242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2431173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get());
2440d268a3cae145afb2720c88ae38fb81550be5584James Dong
2450d268a3cae145afb2720c88ae38fb81550be5584James Dong            // XXX - ignore error from setVideoScalingMode for now
2460d268a3cae145afb2720c88ae38fb81550be5584James Dong            setVideoScalingMode(mVideoScalingMode);
247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetAudioSink:
251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSetAudioSink");
253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findObject("sink", &obj));
256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get());
258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatStart:
262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2633856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatStart");
26443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
2653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mVideoIsAVC = false;
2661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mAudioEOS = false;
2671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mVideoEOS = false;
26832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            mSkipRenderingAudioUntilMediaTimeUs = -1;
26932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            mSkipRenderingVideoUntilMediaTimeUs = -1;
2703fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mVideoLateByUs = 0;
2713fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mNumFramesTotal = 0;
2723fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mNumFramesDropped = 0;
2731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
2745bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource->start();
275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mRenderer = new Renderer(
277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioSink,
278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    new AMessage(kWhatRendererNotify, id()));
279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            looper()->registerHandler(mRenderer);
281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            postScanSources();
283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatScanSources:
287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            int32_t generation;
2891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            CHECK(msg->findInt32("generation", &generation));
2901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (generation != mScanSourcesGeneration) {
2911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // Drop obsolete msg.
2921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
2931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
2941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
2955bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mScanSourcesPending = false;
2965bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
2973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("scanning sources haveAudio=%d, haveVideo=%d",
29843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 mAudioDecoder != NULL, mVideoDecoder != NULL);
29943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
300b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            bool mHadAnySourcesBefore =
301b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                (mAudioDecoder != NULL) || (mVideoDecoder != NULL);
302b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
3035d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George            if (mNativeWindow != NULL) {
3045d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George                instantiateDecoder(false, &mVideoDecoder);
3055d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George            }
306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioSink != NULL) {
3085bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                instantiateDecoder(true, &mAudioDecoder);
309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
311b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            if (!mHadAnySourcesBefore
312b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                    && (mAudioDecoder != NULL || mVideoDecoder != NULL)) {
313b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                // This is the first time we've found anything playable.
314b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
315b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                uint32_t flags = mSource->flags();
316b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
317b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                if (flags & Source::FLAG_DYNAMIC_DURATION) {
318b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                    schedulePollDuration();
319b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                }
320b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            }
321b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
322eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber            status_t err;
323eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber            if ((err = mSource->feedMoreTSData()) != OK) {
3241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
3251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // We're not currently decoding anything (no audio or
3261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // video tracks found) and we just ran out of input data.
327eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber
328eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    if (err == ERROR_END_OF_STREAM) {
329eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                        notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
330eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    } else {
331eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                        notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
332eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    }
3331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                }
334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
337fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber            if ((mAudioDecoder == NULL && mAudioSink != NULL)
338fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber                    || (mVideoDecoder == NULL && mNativeWindow != NULL)) {
339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->post(100000ll);
3405bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                mScanSourcesPending = true;
341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatVideoNotify:
346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatAudioNotify:
347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            bool audio = msg->what() == kWhatAudioNotify;
349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<AMessage> codecRequest;
351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findMessage("codec-request", &codecRequest));
352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(codecRequest->findInt32("what", &what));
355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == ACodec::kWhatFillThisBuffer) {
357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                status_t err = feedDecoderInputData(
358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        audio, codecRequest);
359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3605bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                if (err == -EWOULDBLOCK) {
361eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    if (mSource->feedMoreTSData() == OK) {
3621183a4ab06b9fe01fe39a4b8728bfc71789361fcAndreas Huber                        msg->post(10000ll);
3635bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                    }
364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatEOS) {
366dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                int32_t err;
367dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                CHECK(codecRequest->findInt32("err", &err));
368dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber
369dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                if (err == ERROR_END_OF_STREAM) {
3703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("got %s decoder EOS", audio ? "audio" : "video");
371dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                } else {
3723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("got %s decoder EOS w/ error %d",
373dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                         audio ? "audio" : "video",
374dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                         err);
375dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                }
376dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber
377dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                mRenderer->queueEOS(audio, err);
378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatFlushCompleted) {
3791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                bool needShutdown;
38053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
3821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingAudio, &needShutdown));
383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingAudio = FLUSHED;
384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
3851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingVideo, &needShutdown));
386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingVideo = FLUSHED;
3873fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
3883fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mVideoLateByUs = 0;
389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("decoder %s flush completed", audio ? "audio" : "video");
392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (needShutdown) {
3943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("initiating %s decoder shutdown",
39553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                         audio ? "audio" : "video");
396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
39753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown();
398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
39953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    if (audio) {
40053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingAudio = SHUTTING_DOWN_DECODER;
40153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    } else {
40253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingVideo = SHUTTING_DOWN_DECODER;
40353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    }
404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
4053831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4063831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
4072c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            } else if (what == ACodec::kWhatOutputFormatChanged) {
40831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                if (audio) {
40931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t numChannels;
41031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("channel-count", &numChannels));
4112c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
41231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t sampleRate;
41331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("sample-rate", &sampleRate));
4142c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
4153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("Audio output format changed to %d Hz, %d channels",
41631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         sampleRate, numChannels);
4172c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
41831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->close();
4191948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent
4201948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    audio_output_flags_t flags;
4211948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    int64_t durationUs;
4221948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    // FIXME: we should handle the case where the video decoder is created after
4231948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    // we receive the format change indication. Current code will just make that
4241948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    // we select deep buffer with video which should not be a problem as it should
4251948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    // not prevent from keeping A/V sync.
4261948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    if (mVideoDecoder == NULL &&
4271948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                            mSource->getDuration(&durationUs) == OK &&
4281948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                            durationUs > AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US) {
4291948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                        flags = AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
4301948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    } else {
4311948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                        flags = AUDIO_OUTPUT_FLAG_NONE;
4321948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    }
4331948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent
4349806555d3930be43e11106281dee354820ac1c88Andreas Huber                    int32_t channelMask;
4359806555d3930be43e11106281dee354820ac1c88Andreas Huber                    if (!codecRequest->findInt32("channel-mask", &channelMask)) {
4369806555d3930be43e11106281dee354820ac1c88Andreas Huber                        channelMask = CHANNEL_MASK_USE_CHANNEL_ORDER;
4379806555d3930be43e11106281dee354820ac1c88Andreas Huber                    }
4389806555d3930be43e11106281dee354820ac1c88Andreas Huber
439078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                    CHECK_EQ(mAudioSink->open(
440078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                sampleRate,
441078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                numChannels,
4429806555d3930be43e11106281dee354820ac1c88Andreas Huber                                (audio_channel_mask_t)channelMask,
443078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                AUDIO_FORMAT_PCM_16_BIT,
4441948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                                8 /* bufferCount */,
4451948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                                NULL,
4461948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                                NULL,
4471948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                                flags),
448078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                             (status_t)OK);
44931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->start();
4503831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
45131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mRenderer->signalAudioSinkChanged();
45231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                } else {
45331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    // video
45431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
45531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t width, height;
45631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("width", &width));
45731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("height", &height));
45831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
45931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t cropLeft, cropTop, cropRight, cropBottom;
46031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findRect(
46131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                "crop",
46231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                &cropLeft, &cropTop, &cropRight, &cropBottom));
46331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
4643856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("Video output format changed to %d x %d "
465cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         "(crop: %d x %d @ (%d, %d))",
46631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         width, height,
467cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         (cropRight - cropLeft + 1),
468cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         (cropBottom - cropTop + 1),
469cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         cropLeft, cropTop);
47031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
47131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    notifyListener(
47231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            MEDIA_SET_VIDEO_SIZE,
47331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            cropRight - cropLeft + 1,
47431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            cropBottom - cropTop + 1);
47531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                }
4763831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber            } else if (what == ACodec::kWhatShutdownCompleted) {
4773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("%s shutdown completed", audio ? "audio" : "video");
4783831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                if (audio) {
4793831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mAudioDecoder.clear();
4803831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4813831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER);
4823831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingAudio = SHUT_DOWN;
4833831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                } else {
4843831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mVideoDecoder.clear();
4853831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4863831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER);
4873831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingVideo = SHUT_DOWN;
4883831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                }
4893831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4903831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
491c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber            } else if (what == ACodec::kWhatError) {
49229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("Received error from %s decoder, aborting playback.",
493c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                     audio ? "audio" : "video");
494c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
495c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                mRenderer->queueEOS(audio, UNKNOWN_ERROR);
4965778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else if (what == ACodec::kWhatDrainThisBuffer) {
497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                renderBuffer(audio, codecRequest);
4985778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
4995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                ALOGV("Unhandled codec notification %d.", what);
500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatRendererNotify:
506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("what", &what));
509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == Renderer::kWhatEOS) {
511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
514c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                int32_t finalResult;
515c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                CHECK(msg->findInt32("finalResult", &finalResult));
516c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioEOS = true;
519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mVideoEOS = true;
521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
523c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                if (finalResult == ERROR_END_OF_STREAM) {
5243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("reached %s EOS", audio ? "audio" : "video");
525c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                } else {
52629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                    ALOGE("%s track encountered an error (%d)",
527c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                         audio ? "audio" : "video", finalResult);
528c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
529c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                    notifyListener(
530c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                            MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult);
531c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                }
532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if ((mAudioEOS || mAudioDecoder == NULL)
534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        && (mVideoEOS || mVideoDecoder == NULL)) {
535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
53743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            } else if (what == Renderer::kWhatPosition) {
53843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                int64_t positionUs;
53943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                CHECK(msg->findInt64("positionUs", &positionUs));
54043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
5413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                CHECK(msg->findInt64("videoLateByUs", &mVideoLateByUs));
5423fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
54343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (mDriver != NULL) {
54443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    sp<NuPlayerDriver> driver = mDriver.promote();
54543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    if (driver != NULL) {
54643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                        driver->notifyPosition(positionUs);
5473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
5483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        driver->notifyFrameStats(
5493fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                                mNumFramesTotal, mNumFramesDropped);
55043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    }
55143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
5523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            } else if (what == Renderer::kWhatFlushComplete) {
553f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete);
554f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("renderer %s flush completed.", audio ? "audio" : "video");
559f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong            } else if (what == Renderer::kWhatVideoRenderingStart) {
560f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong                notifyListener(MEDIA_INFO, MEDIA_INFO_RENDERING_START, 0);
561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatMoreDataQueued:
566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case kWhatReset:
5711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        {
5723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatReset");
5731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
574b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            cancelPollDuration();
575b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
576b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber            if (mRenderer != NULL) {
577b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                // There's an edge case where the renderer owns all output
578b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                // buffers and is paused, therefore the decoder will not read
579b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                // more input data and will never encounter the matching
580b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                // discontinuity. To avoid this, we resume the renderer.
581b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber
582b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                if (mFlushingAudio == AWAITING_DISCONTINUITY
583b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                        || mFlushingVideo == AWAITING_DISCONTINUITY) {
584b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                    mRenderer->resume();
585b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                }
586b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber            }
587b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber
5881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mFlushingAudio != NONE || mFlushingVideo != NONE) {
5891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // We're currently flushing, postpone the reset until that's
5901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // completed.
5911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
592ea9d51bd710e6739077a3700f27a1c37767a2f6dAndreas Huber                ALOGV("postponing reset mFlushingAudio=%d, mFlushingVideo=%d",
593ea9d51bd710e6739077a3700f27a1c37767a2f6dAndreas Huber                      mFlushingAudio, mFlushingVideo);
5941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                mResetPostponed = true;
5961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
5971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
5981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
6001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                finishReset();
6011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
6021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
6031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6046e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            mTimeDiscontinuityPending = true;
6056e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
6061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder != NULL) {
6071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(true /* audio */, true /* needShutdown */);
6081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
6091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mVideoDecoder != NULL) {
6111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(false /* audio */, true /* needShutdown */);
6121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
6131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mResetInProgress = true;
6151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            break;
6161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
6171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
61843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        case kWhatSeek:
61943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        {
62043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            int64_t seekTimeUs;
62143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
62243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
6233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)",
62443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 seekTimeUs, seekTimeUs / 1E6);
62543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
62643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            mSource->seekTo(seekTimeUs);
62743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
62843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            if (mDriver != NULL) {
62943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                sp<NuPlayerDriver> driver = mDriver.promote();
63043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (driver != NULL) {
63143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    driver->notifySeekComplete();
63243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
63343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            }
63443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
63543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            break;
63643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
63743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
638b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatPause:
639b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
640b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
641b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->pause();
642b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
643b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
644b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
645b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatResume:
646b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
647b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
648b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->resume();
649b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
650b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
651b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
652f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            TRESPASS();
654f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
655f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
656f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
657f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6583831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() {
6593831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) {
6603831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
6613831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
6623831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
6633831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) {
6643831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
6653831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
6663831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
6673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("both audio and video are flushed now.");
6683831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
6696e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (mTimeDiscontinuityPending) {
6706e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        mRenderer->signalTimeDiscontinuity();
6716e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        mTimeDiscontinuityPending = false;
6726e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
6733831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
67422fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mAudioDecoder != NULL) {
6753831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mAudioDecoder->signalResume();
6763831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
6773831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
67822fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mVideoDecoder != NULL) {
6793831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mVideoDecoder->signalResume();
6803831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
6813831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
6823831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingAudio = NONE;
6833831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingVideo = NONE;
684f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mResetInProgress) {
6863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("reset completed");
6871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetInProgress = false;
6891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        finishReset();
6901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else if (mResetPostponed) {
6911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        (new AMessage(kWhatReset, id()))->post();
6921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetPostponed = false;
69322fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
6941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        postScanSources();
6951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
6961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
6971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() {
6991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mAudioDecoder == NULL);
7001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mVideoDecoder == NULL);
7011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7022bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    ++mScanSourcesGeneration;
7032bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    mScanSourcesPending = false;
7042bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
7051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer.clear();
7062bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
7072bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (mSource != NULL) {
7082bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mSource->stop();
7092bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mSource.clear();
7102bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
7111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
71243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver != NULL) {
71343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
71443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        if (driver != NULL) {
71543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            driver->notifyResetComplete();
71643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
71743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
7181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
7191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() {
7211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mScanSourcesPending) {
7221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        return;
723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
7241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    sp<AMessage> msg = new AMessage(kWhatScanSources, id());
7261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->setInt32("generation", mScanSourcesGeneration);
7271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->post();
7281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mScanSourcesPending = true;
730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7325bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) {
733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (*decoder != NULL) {
734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
737840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    sp<AMessage> format = mSource->getFormat(audio);
738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
739840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    if (format == NULL) {
740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return -EWOULDBLOCK;
741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    if (!audio) {
744840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        AString mime;
745840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        CHECK(format->findString("mime", &mime));
746840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime.c_str());
7473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    }
7483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notify =
750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify,
751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     id());
752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7531173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    *decoder = audio ? new Decoder(notify) :
7541173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                       new Decoder(notify, mNativeWindow);
755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    looper()->registerHandler(*decoder);
756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
757840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    (*decoder)->configure(format);
758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
75943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    int64_t durationUs;
76043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) {
76143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
76243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        if (driver != NULL) {
76343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            driver->notifyDuration(durationUs);
76443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
76543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
76643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
770f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
771f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
773f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
77453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    if ((audio && IsFlushingState(mFlushingAudio))
77553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            || (!audio && IsFlushingState(mFlushingVideo))) {
776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->setInt32("err", INFO_DISCONTINUITY);
777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->post();
778f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
779f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
780f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
781f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> accessUnit;
782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7833fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    bool dropAccessUnit;
7843fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    do {
7853fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        status_t err = mSource->dequeueAccessUnit(audio, &accessUnit);
7865bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
7873fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (err == -EWOULDBLOCK) {
7883fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            return err;
7893fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        } else if (err != OK) {
7903fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            if (err == INFO_DISCONTINUITY) {
7913fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                int32_t type;
7923fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                CHECK(accessUnit->meta()->findInt32("discontinuity", &type));
79353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
7943fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                bool formatChange =
7956e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    (audio &&
7966e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                     (type & ATSParser::DISCONTINUITY_AUDIO_FORMAT))
7976e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    || (!audio &&
7986e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            (type & ATSParser::DISCONTINUITY_VIDEO_FORMAT));
79953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
8006e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                bool timeChange = (type & ATSParser::DISCONTINUITY_TIME) != 0;
8016e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
802df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block                ALOGI("%s discontinuity (formatChange=%d, time=%d)",
8036e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                     audio ? "audio" : "video", formatChange, timeChange);
80432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
8053fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                if (audio) {
8063fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mSkipRenderingAudioUntilMediaTimeUs = -1;
8073fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                } else {
8083fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mSkipRenderingVideoUntilMediaTimeUs = -1;
8093fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                }
81032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
8116e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                if (timeChange) {
8126e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    sp<AMessage> extra;
8136e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    if (accessUnit->meta()->findMessage("extra", &extra)
8146e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            && extra != NULL) {
8156e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        int64_t resumeAtMediaTimeUs;
8166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        if (extra->findInt64(
8176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) {
818df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block                            ALOGI("suppressing rendering of %s until %lld us",
8196e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    audio ? "audio" : "video", resumeAtMediaTimeUs);
8206e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
8216e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            if (audio) {
8226e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                mSkipRenderingAudioUntilMediaTimeUs =
8236e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    resumeAtMediaTimeUs;
8246e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            } else {
8256e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                mSkipRenderingVideoUntilMediaTimeUs =
8266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    resumeAtMediaTimeUs;
8276e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            }
8283fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        }
82932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                    }
83032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                }
8313fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
8326e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                mTimeDiscontinuityPending =
8336e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    mTimeDiscontinuityPending || timeChange;
8346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
8356e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                if (formatChange || timeChange) {
8366e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    flushDecoder(audio, formatChange);
8376e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                } else {
8386e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    // This stream is unaffected by the discontinuity
8396e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
8406e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    if (audio) {
8416e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        mFlushingAudio = FLUSHED;
8426e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    } else {
8436e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        mFlushingVideo = FLUSHED;
8446e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    }
8456e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
8466e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    finishFlushIfPossible();
8476e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
8486e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    return -EWOULDBLOCK;
8496e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                }
85032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            }
85132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
8523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            reply->setInt32("err", err);
8533fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            reply->post();
8543fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            return OK;
855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8573fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (!audio) {
8583fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            ++mNumFramesTotal;
8593fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        }
8603fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
8613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        dropAccessUnit = false;
8623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (!audio
8633fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && mVideoLateByUs > 100000ll
8643fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && mVideoIsAVC
8653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && !IsAVCReferenceFrame(accessUnit)) {
8663fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            dropAccessUnit = true;
8673fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            ++mNumFramesDropped;
8683fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        }
8693fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    } while (dropAccessUnit);
870f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    // ALOGV("returned a valid buffer of %s data", audio ? "audio" : "video");
872f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
873f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0
874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t mediaTimeUs;
875f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs));
8763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("feeding %s input buffer at media time %.2f secs",
877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         audio ? "audio" : "video",
878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         mediaTimeUs / 1E6);
879f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif
880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8812d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    reply->setBuffer("buffer", accessUnit);
882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->post();
883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
884f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
887f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) {
8883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    // ALOGV("renderBuffer %s", audio ? "audio" : "video");
889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
891f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
89318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) {
89418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // We're currently attempting to flush the decoder, in order
89518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // to complete this, the decoder wants all its buffers back,
89618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // so we don't want any output buffers it sent us (from before
89718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // we initiated the flush) to be stuck in the renderer's queue.
89818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
8993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("we're still flushing the %s decoder, sending its output buffer"
90018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber             " right back.", audio ? "audio" : "video");
90118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
90218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        reply->post();
90318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        return;
90418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
90518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
9062d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    sp<ABuffer> buffer;
9072d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    CHECK(msg->findBuffer("buffer", &buffer));
908f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
90932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    int64_t &skipUntilMediaTimeUs =
91032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        audio
91132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            ? mSkipRenderingAudioUntilMediaTimeUs
91232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            : mSkipRenderingVideoUntilMediaTimeUs;
91332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
91432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    if (skipUntilMediaTimeUs >= 0) {
91532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        int64_t mediaTimeUs;
91632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs));
91732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
91832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        if (mediaTimeUs < skipUntilMediaTimeUs) {
9193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("dropping %s buffer at time %lld as requested.",
92032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 audio ? "audio" : "video",
92132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 mediaTimeUs);
92232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
92332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            reply->post();
92432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            return;
92532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        }
92632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
92732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        skipUntilMediaTimeUs = -1;
92832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    }
92932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
930f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mRenderer->queueBuffer(audio, buffer, reply);
931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
933f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) {
93443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver == NULL) {
935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
936f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
937f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
93843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<NuPlayerDriver> driver = mDriver.promote();
939f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
94043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (driver == NULL) {
941f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
942f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
943f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
944a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber    driver->notifyListener(msg, ext1, ext2);
945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
946f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
9471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) {
9486e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if ((audio && mAudioDecoder == NULL) || (!audio && mVideoDecoder == NULL)) {
949df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("flushDecoder %s without decoder present",
9506e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber             audio ? "audio" : "video");
9516e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
9526e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
9531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    // Make sure we don't continue to scan sources until we finish flushing.
9541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    ++mScanSourcesGeneration;
95543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mScanSourcesPending = false;
9561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (audio ? mAudioDecoder : mVideoDecoder)->signalFlush();
9581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer->flush(audio);
9591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    FlushStatus newStatus =
9611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER;
9621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (audio) {
9641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingAudio == NONE
9651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingAudio == AWAITING_DISCONTINUITY);
9661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingAudio = newStatus;
9681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingVideo == NONE) {
9701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingVideo = (mVideoDecoder != NULL)
9711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
9721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
9731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
9741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else {
9751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingVideo == NONE
9761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingVideo == AWAITING_DISCONTINUITY);
9771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingVideo = newStatus;
9791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingAudio == NONE) {
9811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingAudio = (mAudioDecoder != NULL)
9821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
9831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
9841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
9851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
9861aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
9871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
988840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Hubersp<AMessage> NuPlayer::Source::getFormat(bool audio) {
989840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    sp<MetaData> meta = getFormatMeta(audio);
990840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
991840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    if (meta == NULL) {
992840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        return NULL;
993840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    }
994840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
995840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    sp<AMessage> msg = new AMessage;
996840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
997840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    if(convertMetaDataToMessage(meta, &msg) == OK) {
998840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        return msg;
999840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    }
1000840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    return NULL;
1001840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber}
1002840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
10030d268a3cae145afb2720c88ae38fb81550be5584James Dongstatus_t NuPlayer::setVideoScalingMode(int32_t mode) {
10040d268a3cae145afb2720c88ae38fb81550be5584James Dong    mVideoScalingMode = mode;
1005376074ed1c3c368aeb336954a07632cd806288e2James Dong    if (mNativeWindow != NULL
1006376074ed1c3c368aeb336954a07632cd806288e2James Dong            && mNativeWindow->getNativeWindow() != NULL) {
10070d268a3cae145afb2720c88ae38fb81550be5584James Dong        status_t ret = native_window_set_scaling_mode(
10080d268a3cae145afb2720c88ae38fb81550be5584James Dong                mNativeWindow->getNativeWindow().get(), mVideoScalingMode);
10090d268a3cae145afb2720c88ae38fb81550be5584James Dong        if (ret != OK) {
10100d268a3cae145afb2720c88ae38fb81550be5584James Dong            ALOGE("Failed to set scaling mode (%d): %s",
10110d268a3cae145afb2720c88ae38fb81550be5584James Dong                -ret, strerror(-ret));
10120d268a3cae145afb2720c88ae38fb81550be5584James Dong            return ret;
10130d268a3cae145afb2720c88ae38fb81550be5584James Dong        }
10140d268a3cae145afb2720c88ae38fb81550be5584James Dong    }
10150d268a3cae145afb2720c88ae38fb81550be5584James Dong    return OK;
10160d268a3cae145afb2720c88ae38fb81550be5584James Dong}
10170d268a3cae145afb2720c88ae38fb81550be5584James Dong
1018b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Hubervoid NuPlayer::schedulePollDuration() {
1019b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    sp<AMessage> msg = new AMessage(kWhatPollDuration, id());
1020b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    msg->setInt32("generation", mPollDurationGeneration);
1021b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    msg->post();
1022b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber}
1023b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
1024b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Hubervoid NuPlayer::cancelPollDuration() {
1025b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    ++mPollDurationGeneration;
1026b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber}
1027b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
1028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
1029