NuPlayer.cpp revision 078cfcf7cce9185ec7559910d08b0bc02bfc88a3
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"
285bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "StreamingSource.h"
295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
305bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "ATSParser.h"
31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
323831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber#include <media/stagefright/foundation/hexdump.h>
33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h>
35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h>
36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h>
37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h>
38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h>
39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <surfaceflinger/Surface.h>
401173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h>
41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
42f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
46f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer()
479b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    : mUIDValid(false),
489b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber      mAudioEOS(false),
49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mVideoEOS(false),
505bc087c573c70c84c6a39946457590b42d392a33Andreas Huber      mScanSourcesPending(false),
511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mScanSourcesGeneration(0),
52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mFlushingAudio(NONE),
531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mFlushingVideo(NONE),
541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mResetInProgress(false),
551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mResetPostponed(false) {
56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
58f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() {
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
619b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid NuPlayer::setUID(uid_t uid) {
629b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUIDValid = true;
639b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUID = uid;
649b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber}
659b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
6643c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) {
6743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mDriver = driver;
68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
70f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) {
71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
735bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->setObject("source", new StreamingSource(source));
745bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->post();
755bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
765bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
775bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::setDataSource(
785bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        const char *url, const KeyedVector<String8, String8> *headers) {
795bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
819b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    msg->setObject("source", new HTTPLiveSource(url, headers, mUIDValid, mUID));
82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
85f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setVideoSurface(const sp<Surface> &surface) {
861173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id());
871173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    msg->setObject("native-window", new NativeWindowWrapper(surface));
881173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    msg->post();
891173118eace0e9e347cb007f0da817cee87579edGlenn Kasten}
901173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
911173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid NuPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
921173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id());
931173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ?
941173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                new SurfaceTextureClient(surfaceTexture) : NULL);
951173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    msg->setObject("native-window", new NativeWindowWrapper(surfaceTextureClient));
96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
99f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) {
100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id());
101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setObject("sink", sink);
102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
105f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() {
106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    (new AMessage(kWhatStart, id()))->post();
107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
10943c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() {
110b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    (new AMessage(kWhatPause, id()))->post();
11143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
11243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
11343c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() {
114b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    (new AMessage(kWhatResume, id()))->post();
11543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
11643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
1171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() {
1181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (new AMessage(kWhatReset, id()))->post();
1191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
1201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
12143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) {
12243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSeek, id());
12343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->setInt64("seekTimeUs", seekTimeUs);
12443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->post();
12543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
12643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
12753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static
1281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) {
12953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    switch (state) {
13053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        case FLUSHING_DECODER:
1311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
1321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = false;
13353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
13453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
13553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
1361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case FLUSHING_DECODER_SHUTDOWN:
1371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
1381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = true;
13953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
14053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
14153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
14253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        default:
14353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return false;
14453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    }
14553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber}
14653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
147f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetDataSource:
150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatSetDataSource");
152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(mSource == NULL);
154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1555bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            sp<RefBase> obj;
1565bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            CHECK(msg->findObject("source", &obj));
157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1585bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource = static_cast<Source *>(obj.get());
159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1621173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        case kWhatSetVideoNativeWindow:
163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1641173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            LOGV("kWhatSetVideoNativeWindow");
165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
1671173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            CHECK(msg->findObject("native-window", &obj));
168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1691173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get());
170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetAudioSink:
174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatSetAudioSink");
176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findObject("sink", &obj));
179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get());
181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatStart:
185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
18643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            LOGV("kWhatStart");
18743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
1881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mAudioEOS = false;
1891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mVideoEOS = false;
19032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            mSkipRenderingAudioUntilMediaTimeUs = -1;
19132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            mSkipRenderingVideoUntilMediaTimeUs = -1;
1921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
1935bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource->start();
194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mRenderer = new Renderer(
196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioSink,
197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    new AMessage(kWhatRendererNotify, id()));
198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            looper()->registerHandler(mRenderer);
200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            postScanSources();
202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatScanSources:
206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            int32_t generation;
2081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            CHECK(msg->findInt32("generation", &generation));
2091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (generation != mScanSourcesGeneration) {
2101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // Drop obsolete msg.
2111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
2121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
2131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
2145bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mScanSourcesPending = false;
2155bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
21643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            LOGV("scanning sources haveAudio=%d, haveVideo=%d",
21743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 mAudioDecoder != NULL, mVideoDecoder != NULL);
21843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
2195bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            instantiateDecoder(false, &mVideoDecoder);
220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioSink != NULL) {
2225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                instantiateDecoder(true, &mAudioDecoder);
223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2255bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            if (!mSource->feedMoreTSData()) {
2261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
2271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // We're not currently decoding anything (no audio or
2281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // video tracks found) and we just ran out of input data.
2291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
2301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                }
231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->post(100000ll);
2365bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                mScanSourcesPending = true;
237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatVideoNotify:
242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatAudioNotify:
243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            bool audio = msg->what() == kWhatAudioNotify;
245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<AMessage> codecRequest;
247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findMessage("codec-request", &codecRequest));
248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(codecRequest->findInt32("what", &what));
251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == ACodec::kWhatFillThisBuffer) {
253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                status_t err = feedDecoderInputData(
254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        audio, codecRequest);
255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2565bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                if (err == -EWOULDBLOCK) {
2575bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                    if (mSource->feedMoreTSData()) {
2585bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                        msg->post();
2595bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                    }
260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatEOS) {
262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mRenderer->queueEOS(audio, ERROR_END_OF_STREAM);
263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatFlushCompleted) {
2641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                bool needShutdown;
26553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
2671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingAudio, &needShutdown));
268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingAudio = FLUSHED;
269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
2701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingVideo, &needShutdown));
271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingVideo = FLUSHED;
272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("decoder %s flush completed", audio ? "audio" : "video");
275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (needShutdown) {
2771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    LOGV("initiating %s decoder shutdown",
27853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                         audio ? "audio" : "video");
279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
28053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown();
281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
28253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    if (audio) {
28353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingAudio = SHUTTING_DOWN_DECODER;
28453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    } else {
28553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingVideo = SHUTTING_DOWN_DECODER;
28653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    }
287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
2883831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
2893831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
2902c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            } else if (what == ACodec::kWhatOutputFormatChanged) {
29131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                if (audio) {
29231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t numChannels;
29331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("channel-count", &numChannels));
2942c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
29531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t sampleRate;
29631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("sample-rate", &sampleRate));
2972c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
29831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    LOGV("Audio output format changed to %d Hz, %d channels",
29931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         sampleRate, numChannels);
3002c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
30131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->close();
302078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                    CHECK_EQ(mAudioSink->open(
303078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                sampleRate,
304078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                numChannels,
305078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                AUDIO_FORMAT_PCM_16_BIT,
306078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                8 /* bufferCount */),
307078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                             (status_t)OK);
30831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->start();
3093831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
31031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mRenderer->signalAudioSinkChanged();
31131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                } else {
31231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    // video
31331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
31431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t width, height;
31531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("width", &width));
31631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("height", &height));
31731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
31831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t cropLeft, cropTop, cropRight, cropBottom;
31931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findRect(
32031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                "crop",
32131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                &cropLeft, &cropTop, &cropRight, &cropBottom));
32231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
32331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    LOGV("Video output format changed to %d x %d "
324cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         "(crop: %d x %d @ (%d, %d))",
32531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         width, height,
326cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         (cropRight - cropLeft + 1),
327cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         (cropBottom - cropTop + 1),
328cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         cropLeft, cropTop);
32931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
33031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    notifyListener(
33131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            MEDIA_SET_VIDEO_SIZE,
33231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            cropRight - cropLeft + 1,
33331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            cropBottom - cropTop + 1);
33431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                }
3353831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber            } else if (what == ACodec::kWhatShutdownCompleted) {
3361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("%s shutdown completed", audio ? "audio" : "video");
3373831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                if (audio) {
3383831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mAudioDecoder.clear();
3393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3403831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER);
3413831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingAudio = SHUT_DOWN;
3423831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                } else {
3433831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mVideoDecoder.clear();
3443831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3453831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER);
3463831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingVideo = SHUT_DOWN;
3473831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                }
3483831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3493831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
350c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber            } else if (what == ACodec::kWhatError) {
351c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                LOGE("Received error from %s decoder, aborting playback.",
352c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                     audio ? "audio" : "video");
353c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
354c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                mRenderer->queueEOS(audio, UNKNOWN_ERROR);
355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else {
356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer);
357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                renderBuffer(audio, codecRequest);
359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatRendererNotify:
365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("what", &what));
368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == Renderer::kWhatEOS) {
370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
373c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                int32_t finalResult;
374c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                CHECK(msg->findInt32("finalResult", &finalResult));
375c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioEOS = true;
378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mVideoEOS = true;
380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
382c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                if (finalResult == ERROR_END_OF_STREAM) {
383c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                    LOGV("reached %s EOS", audio ? "audio" : "video");
384c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                } else {
385c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                    LOGE("%s track encountered an error (0x%08x)",
386c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                         audio ? "audio" : "video", finalResult);
387c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
388c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                    notifyListener(
389c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                            MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult);
390c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                }
391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if ((mAudioEOS || mAudioDecoder == NULL)
393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        && (mVideoEOS || mVideoDecoder == NULL)) {
394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
39643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            } else if (what == Renderer::kWhatPosition) {
39743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                int64_t positionUs;
39843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                CHECK(msg->findInt64("positionUs", &positionUs));
39943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
40043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (mDriver != NULL) {
40143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    sp<NuPlayerDriver> driver = mDriver.promote();
40243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    if (driver != NULL) {
40343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                        driver->notifyPosition(positionUs);
40443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    }
40543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else {
407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete);
408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("renderer %s flush completed.", audio ? "audio" : "video");
413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatMoreDataQueued:
418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case kWhatReset:
4231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        {
4241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatReset");
4251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mFlushingAudio != NONE || mFlushingVideo != NONE) {
4271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // We're currently flushing, postpone the reset until that's
4281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // completed.
4291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("postponing reset");
4311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                mResetPostponed = true;
4331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
4341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
4371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                finishReset();
4381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
4391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder != NULL) {
4421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(true /* audio */, true /* needShutdown */);
4431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mVideoDecoder != NULL) {
4461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(false /* audio */, true /* needShutdown */);
4471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mResetInProgress = true;
4501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            break;
4511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
4521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
45343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        case kWhatSeek:
45443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        {
45543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            int64_t seekTimeUs;
45643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
45743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
45822fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber            LOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)",
45943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 seekTimeUs, seekTimeUs / 1E6);
46043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
46143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            mSource->seekTo(seekTimeUs);
46243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
46343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            if (mDriver != NULL) {
46443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                sp<NuPlayerDriver> driver = mDriver.promote();
46543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (driver != NULL) {
46643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    driver->notifySeekComplete();
46743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
46843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            }
46943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
47043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            break;
47143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
47243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
473b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatPause:
474b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
475b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
476b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->pause();
477b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
478b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
479b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
480b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatResume:
481b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
482b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
483b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->resume();
484b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
485b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
486b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            TRESPASS();
489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4933831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() {
4943831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) {
4953831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
4963831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
4973831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4983831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) {
4993831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
5003831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
5013831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
5021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    LOGV("both audio and video are flushed now.");
5033831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
5043831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mRenderer->signalTimeDiscontinuity();
5053831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
50622fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mAudioDecoder != NULL) {
5073831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mAudioDecoder->signalResume();
5083831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
5093831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
51022fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mVideoDecoder != NULL) {
5113831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mVideoDecoder->signalResume();
5123831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
5133831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
5143831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingAudio = NONE;
5153831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingVideo = NONE;
516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mResetInProgress) {
5181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        LOGV("reset completed");
5191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetInProgress = false;
5211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        finishReset();
5221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else if (mResetPostponed) {
5231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        (new AMessage(kWhatReset, id()))->post();
5241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetPostponed = false;
52522fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
5261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        postScanSources();
5271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
5281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
5291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() {
5311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mAudioDecoder == NULL);
5321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mVideoDecoder == NULL);
5331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer.clear();
5351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mSource.clear();
5361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
53743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver != NULL) {
53843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
53943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        if (driver != NULL) {
54043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            driver->notifyResetComplete();
54143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
54243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
5431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
5441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() {
5461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mScanSourcesPending) {
5471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        return;
548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
5491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    sp<AMessage> msg = new AMessage(kWhatScanSources, id());
5511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->setInt32("generation", mScanSourcesGeneration);
5521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->post();
5531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mScanSourcesPending = true;
555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5575bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) {
558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (*decoder != NULL) {
559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5625bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<MetaData> meta = mSource->getFormat(audio);
563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5645bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    if (meta == NULL) {
565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return -EWOULDBLOCK;
566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notify =
569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify,
570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     id());
571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5721173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    *decoder = audio ? new Decoder(notify) :
5731173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                       new Decoder(notify, mNativeWindow);
574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    looper()->registerHandler(*decoder);
575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5765bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    (*decoder)->configure(meta);
577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
57843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    int64_t durationUs;
57943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) {
58043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
58143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        if (driver != NULL) {
58243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            driver->notifyDuration(durationUs);
58343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
58443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
58543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
586f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
588f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
589f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
590f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
591f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
592f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
59353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    if ((audio && IsFlushingState(mFlushingAudio))
59453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            || (!audio && IsFlushingState(mFlushingVideo))) {
595f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->setInt32("err", INFO_DISCONTINUITY);
596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->post();
597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
598f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
599f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
600f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> accessUnit;
6015bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    status_t err = mSource->dequeueAccessUnit(audio, &accessUnit);
602f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err == -EWOULDBLOCK) {
604f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
605f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else if (err != OK) {
606f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (err == INFO_DISCONTINUITY) {
6075bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            int32_t type;
6085bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            CHECK(accessUnit->meta()->findInt32("discontinuity", &type));
6095bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
6105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            bool formatChange =
6115bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                type == ATSParser::DISCONTINUITY_FORMATCHANGE;
61253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
6131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("%s discontinuity (formatChange=%d)",
61453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                 audio ? "audio" : "video", formatChange);
61553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
61632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            if (audio) {
61732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                mSkipRenderingAudioUntilMediaTimeUs = -1;
61832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            } else {
61932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                mSkipRenderingVideoUntilMediaTimeUs = -1;
62032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            }
62132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
62232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            sp<AMessage> extra;
62332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            if (accessUnit->meta()->findMessage("extra", &extra)
62432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                    && extra != NULL) {
62532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                int64_t resumeAtMediaTimeUs;
62632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                if (extra->findInt64(
62732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                            "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) {
62832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                    LOGI("suppressing rendering of %s until %lld us",
62932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                            audio ? "audio" : "video", resumeAtMediaTimeUs);
63032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
63132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                    if (audio) {
63232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                        mSkipRenderingAudioUntilMediaTimeUs =
63332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                            resumeAtMediaTimeUs;
63432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                    } else {
63532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                        mSkipRenderingVideoUntilMediaTimeUs =
63632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                            resumeAtMediaTimeUs;
63732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                    }
63832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                }
63932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            }
64032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
6411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            flushDecoder(audio, formatChange);
642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->setInt32("err", err);
645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->post();
646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
647f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
64943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    // LOGV("returned a valid buffer of %s data", audio ? "audio" : "video");
650f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
651f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0
652f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t mediaTimeUs;
653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs));
6541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    LOGV("feeding %s input buffer at media time %.2f secs",
655f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         audio ? "audio" : "video",
656f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         mediaTimeUs / 1E6);
657f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif
658f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
659f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->setObject("buffer", accessUnit);
660f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->post();
661f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
662f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
663f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
664f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
665f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) {
66643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    // LOGV("renderBuffer %s", audio ? "audio" : "video");
667f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
668f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
669f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
670f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
67118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) {
67218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // We're currently attempting to flush the decoder, in order
67318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // to complete this, the decoder wants all its buffers back,
67418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // so we don't want any output buffers it sent us (from before
67518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // we initiated the flush) to be stuck in the renderer's queue.
67618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
67718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        LOGV("we're still flushing the %s decoder, sending its output buffer"
67818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber             " right back.", audio ? "audio" : "video");
67918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
68018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        reply->post();
68118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        return;
68218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
68318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
684f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<RefBase> obj;
685f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findObject("buffer", &obj));
686f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get());
688f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
68932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    int64_t &skipUntilMediaTimeUs =
69032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        audio
69132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            ? mSkipRenderingAudioUntilMediaTimeUs
69232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            : mSkipRenderingVideoUntilMediaTimeUs;
69332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
69432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    if (skipUntilMediaTimeUs >= 0) {
69532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        int64_t mediaTimeUs;
69632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs));
69732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
69832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        if (mediaTimeUs < skipUntilMediaTimeUs) {
69932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            LOGV("dropping %s buffer at time %lld as requested.",
70032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 audio ? "audio" : "video",
70132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 mediaTimeUs);
70232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
70332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            reply->post();
70432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            return;
70532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        }
70632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
70732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        skipUntilMediaTimeUs = -1;
70832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    }
70932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mRenderer->queueBuffer(audio, buffer, reply);
711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
713f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) {
71443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver == NULL) {
715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
71843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<NuPlayerDriver> driver = mDriver.promote();
719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
72043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (driver == NULL) {
721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
72443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    driver->sendEvent(msg, ext1, ext2);
725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) {
7281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    // Make sure we don't continue to scan sources until we finish flushing.
7291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    ++mScanSourcesGeneration;
73043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mScanSourcesPending = false;
7311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (audio ? mAudioDecoder : mVideoDecoder)->signalFlush();
7331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer->flush(audio);
7341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    FlushStatus newStatus =
7361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER;
7371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (audio) {
7391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingAudio == NONE
7401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingAudio == AWAITING_DISCONTINUITY);
7411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingAudio = newStatus;
7431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingVideo == NONE) {
7451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingVideo = (mVideoDecoder != NULL)
7461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
7471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
7481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
7491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else {
7501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingVideo == NONE
7511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingVideo == AWAITING_DISCONTINUITY);
7521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingVideo = newStatus;
7541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingAudio == NONE) {
7561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingAudio = (mAudioDecoder != NULL)
7571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
7581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
7591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
7601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
7611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
7621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
764