NuPlayer.cpp revision 9b80c2bdb205bc143104f54d0743b6eedd67b14e
1f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn/* 2f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * Copyright (C) 2010 The Android Open Source Project 3f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * 4f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * you may not use this file except in compliance with the License. 6f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * You may obtain a copy of the License at 7f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * 8f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * 10f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 11f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * See the License for the specific language governing permissions and 14f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * limitations under the License. 156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 16f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn 176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn//#define LOG_NDEBUG 0 186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn#define LOG_TAG "NuPlayer" 196213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale#include <utils/Log.h> 205406e7ade87c33f70c83a283781dcc48fb67cdb9Andrii Kulian 216213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale#include "NuPlayer.h" 22412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 23412754816d2b8e83f0f5f860b13f09f53d2da05fWinson#include "HTTPLiveSource.h" 24f7cab10b796d0f66eb690867ba327b4bb00165e3Wale Ogunwale#include "NuPlayerDecoder.h" 256213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale#include "NuPlayerDriver.h" 266213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale#include "NuPlayerRenderer.h" 275cd907d3d6ceebf8731ef1f69347cce6f76109e9Wale Ogunwale#include "NuPlayerSource.h" 286213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale#include "StreamingSource.h" 290bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski 300bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski#include "ATSParser.h" 310bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski 320bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski#include <media/stagefright/foundation/hexdump.h> 330bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski#include <media/stagefright/foundation/ABuffer.h> 349cac3b4d4629f10423e293a77f3c2184ba867817Filip Gruszczynski#include <media/stagefright/foundation/ADebug.h> 35dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0Sudheer Shanka#include <media/stagefright/foundation/AMessage.h> 366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn#include <media/stagefright/ACodec.h> 37e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale#include <media/stagefright/MediaErrors.h> 38412754816d2b8e83f0f5f860b13f09f53d2da05fWinson#include <media/stagefright/MetaData.h> 396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn#include <surfaceflinger/Surface.h> 40412754816d2b8e83f0f5f860b13f09f53d2da05fWinson#include <gui/ISurfaceTexture.h> 416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornnamespace android { 43cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown 44412754816d2b8e83f0f5f860b13f09f53d2da05fWinson//////////////////////////////////////////////////////////////////////////////// 456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne HackbornNuPlayer::NuPlayer() 476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn : mUIDValid(false), 48412754816d2b8e83f0f5f860b13f09f53d2da05fWinson mAudioEOS(false), 491e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale mVideoEOS(false), 50f83e824216435e45f36a3587e269888f791b2a01Selim Cinek mScanSourcesPending(false), 51f83e824216435e45f36a3587e269888f791b2a01Selim Cinek mScanSourcesGeneration(0), 52f83e824216435e45f36a3587e269888f791b2a01Selim Cinek mFlushingAudio(NONE), 53f83e824216435e45f36a3587e269888f791b2a01Selim Cinek mFlushingVideo(NONE), 54e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale mResetInProgress(false), 559302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mResetPostponed(false) { 56853c99a083dc6a96694373c48f427e4d3466d4a9Winson Chung} 571e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne HackbornNuPlayer::~NuPlayer() { 59a9d131c30878cacdaeacb4f43a82a7cc5b872453Jeff Brown} 606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 61f83e824216435e45f36a3587e269888f791b2a01Selim Cinekvoid NuPlayer::setUID(uid_t uid) { 626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mUIDValid = true; 636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mUID = uid; 64f83e824216435e45f36a3587e269888f791b2a01Selim Cinek} 656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornvoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) { 67f83e824216435e45f36a3587e269888f791b2a01Selim Cinek mDriver = driver; 68e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale} 69e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale 70e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwalevoid NuPlayer::setDataSource(const sp<IStreamSource> &source) { 716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 72c042ee2acd8529b95c5dc99240d626e61d2500cdJeff Brown 73c042ee2acd8529b95c5dc99240d626e61d2500cdJeff Brown msg->setObject("source", new StreamingSource(source)); 74c042ee2acd8529b95c5dc99240d626e61d2500cdJeff Brown msg->post(); 756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn} 766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornvoid NuPlayer::setDataSource( 786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn const char *url, const KeyedVector<String8, String8> *headers) { 799302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 809302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 819302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown msg->setObject("source", new HTTPLiveSource(url, headers, mUIDValid, mUID)); 823787de16d24001eeb452e1c711d4290a396e67c9Vladislav Kaznacheev msg->post(); 833787de16d24001eeb452e1c711d4290a396e67c9Vladislav Kaznacheev} 846213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale 856213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwalevoid NuPlayer::setVideoSurface(const sp<Surface> &surface) { 866213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id()); 876213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale msg->setObject("native-window", new NativeWindowWrapper(surface)); 881e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale msg->post(); 891e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale} 901e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 919302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid NuPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id()); 936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ? 946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn new SurfaceTextureClient(surfaceTexture) : NULL); 956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn msg->setObject("native-window", new NativeWindowWrapper(surfaceTextureClient)); 966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn msg->post(); 97412754816d2b8e83f0f5f860b13f09f53d2da05fWinson} 98412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 99412754816d2b8e83f0f5f860b13f09f53d2da05fWinsonvoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) { 100412754816d2b8e83f0f5f860b13f09f53d2da05fWinson sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id()); 101412754816d2b8e83f0f5f860b13f09f53d2da05fWinson msg->setObject("sink", sink); 102412754816d2b8e83f0f5f860b13f09f53d2da05fWinson msg->post(); 103412754816d2b8e83f0f5f860b13f09f53d2da05fWinson} 104412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 105412754816d2b8e83f0f5f860b13f09f53d2da05fWinsonvoid NuPlayer::start() { 106412754816d2b8e83f0f5f860b13f09f53d2da05fWinson (new AMessage(kWhatStart, id()))->post(); 107412754816d2b8e83f0f5f860b13f09f53d2da05fWinson} 108412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 109412754816d2b8e83f0f5f860b13f09f53d2da05fWinsonvoid NuPlayer::pause() { 110412754816d2b8e83f0f5f860b13f09f53d2da05fWinson (new AMessage(kWhatPause, id()))->post(); 111412754816d2b8e83f0f5f860b13f09f53d2da05fWinson} 112412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 113412754816d2b8e83f0f5f860b13f09f53d2da05fWinsonvoid NuPlayer::resume() { 114412754816d2b8e83f0f5f860b13f09f53d2da05fWinson (new AMessage(kWhatResume, id()))->post(); 115412754816d2b8e83f0f5f860b13f09f53d2da05fWinson} 116412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 117412754816d2b8e83f0f5f860b13f09f53d2da05fWinsonvoid NuPlayer::resetAsync() { 118412754816d2b8e83f0f5f860b13f09f53d2da05fWinson (new AMessage(kWhatReset, id()))->post(); 119412754816d2b8e83f0f5f860b13f09f53d2da05fWinson} 120412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 121412754816d2b8e83f0f5f860b13f09f53d2da05fWinsonvoid NuPlayer::seekToAsync(int64_t seekTimeUs) { 122412754816d2b8e83f0f5f860b13f09f53d2da05fWinson sp<AMessage> msg = new AMessage(kWhatSeek, id()); 123412754816d2b8e83f0f5f860b13f09f53d2da05fWinson msg->setInt64("seekTimeUs", seekTimeUs); 124412754816d2b8e83f0f5f860b13f09f53d2da05fWinson msg->post(); 125412754816d2b8e83f0f5f860b13f09f53d2da05fWinson} 126412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 1276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn// static 1286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) { 1296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn switch (state) { 1308e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang case FLUSHING_DECODER: 131f7cab10b796d0f66eb690867ba327b4bb00165e3Wale Ogunwale if (needShutdown != NULL) { 132412754816d2b8e83f0f5f860b13f09f53d2da05fWinson *needShutdown = false; 133412754816d2b8e83f0f5f860b13f09f53d2da05fWinson } 134412754816d2b8e83f0f5f860b13f09f53d2da05fWinson return true; 135412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 136412754816d2b8e83f0f5f860b13f09f53d2da05fWinson case FLUSHING_DECODER_SHUTDOWN: 137412754816d2b8e83f0f5f860b13f09f53d2da05fWinson if (needShutdown != NULL) { 138412754816d2b8e83f0f5f860b13f09f53d2da05fWinson *needShutdown = true; 139412754816d2b8e83f0f5f860b13f09f53d2da05fWinson } 140412754816d2b8e83f0f5f860b13f09f53d2da05fWinson return true; 141412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 142412754816d2b8e83f0f5f860b13f09f53d2da05fWinson default: 143412754816d2b8e83f0f5f860b13f09f53d2da05fWinson return false; 144412754816d2b8e83f0f5f860b13f09f53d2da05fWinson } 145412754816d2b8e83f0f5f860b13f09f53d2da05fWinson} 146412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 147412754816d2b8e83f0f5f860b13f09f53d2da05fWinsonvoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) { 148412754816d2b8e83f0f5f860b13f09f53d2da05fWinson switch (msg->what()) { 149412754816d2b8e83f0f5f860b13f09f53d2da05fWinson case kWhatSetDataSource: 150412754816d2b8e83f0f5f860b13f09f53d2da05fWinson { 151412754816d2b8e83f0f5f860b13f09f53d2da05fWinson LOGV("kWhatSetDataSource"); 152f7cab10b796d0f66eb690867ba327b4bb00165e3Wale Ogunwale 153f7cab10b796d0f66eb690867ba327b4bb00165e3Wale Ogunwale CHECK(mSource == NULL); 154f7cab10b796d0f66eb690867ba327b4bb00165e3Wale Ogunwale 155412754816d2b8e83f0f5f860b13f09f53d2da05fWinson sp<RefBase> obj; 156412754816d2b8e83f0f5f860b13f09f53d2da05fWinson CHECK(msg->findObject("source", &obj)); 157412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 158412754816d2b8e83f0f5f860b13f09f53d2da05fWinson mSource = static_cast<Source *>(obj.get()); 159412754816d2b8e83f0f5f860b13f09f53d2da05fWinson break; 160412754816d2b8e83f0f5f860b13f09f53d2da05fWinson } 161412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 162412754816d2b8e83f0f5f860b13f09f53d2da05fWinson case kWhatSetVideoNativeWindow: 163412754816d2b8e83f0f5f860b13f09f53d2da05fWinson { 164412754816d2b8e83f0f5f860b13f09f53d2da05fWinson LOGV("kWhatSetVideoNativeWindow"); 165412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 166412754816d2b8e83f0f5f860b13f09f53d2da05fWinson sp<RefBase> obj; 167412754816d2b8e83f0f5f860b13f09f53d2da05fWinson CHECK(msg->findObject("native-window", &obj)); 168412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 169412754816d2b8e83f0f5f860b13f09f53d2da05fWinson mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get()); 170412754816d2b8e83f0f5f860b13f09f53d2da05fWinson break; 171412754816d2b8e83f0f5f860b13f09f53d2da05fWinson } 172412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 173412754816d2b8e83f0f5f860b13f09f53d2da05fWinson case kWhatSetAudioSink: 174412754816d2b8e83f0f5f860b13f09f53d2da05fWinson { 175412754816d2b8e83f0f5f860b13f09f53d2da05fWinson LOGV("kWhatSetAudioSink"); 176412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 177412754816d2b8e83f0f5f860b13f09f53d2da05fWinson sp<RefBase> obj; 178412754816d2b8e83f0f5f860b13f09f53d2da05fWinson CHECK(msg->findObject("sink", &obj)); 179412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 180412754816d2b8e83f0f5f860b13f09f53d2da05fWinson mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get()); 181412754816d2b8e83f0f5f860b13f09f53d2da05fWinson break; 182412754816d2b8e83f0f5f860b13f09f53d2da05fWinson } 183412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 184412754816d2b8e83f0f5f860b13f09f53d2da05fWinson case kWhatStart: 185412754816d2b8e83f0f5f860b13f09f53d2da05fWinson { 186412754816d2b8e83f0f5f860b13f09f53d2da05fWinson LOGV("kWhatStart"); 187412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 188f7cab10b796d0f66eb690867ba327b4bb00165e3Wale Ogunwale mAudioEOS = false; 189412754816d2b8e83f0f5f860b13f09f53d2da05fWinson mVideoEOS = false; 190412754816d2b8e83f0f5f860b13f09f53d2da05fWinson mSkipRenderingAudioUntilMediaTimeUs = -1; 191412754816d2b8e83f0f5f860b13f09f53d2da05fWinson mSkipRenderingVideoUntilMediaTimeUs = -1; 192412754816d2b8e83f0f5f860b13f09f53d2da05fWinson 193412754816d2b8e83f0f5f860b13f09f53d2da05fWinson mSource->start(); 1946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1958e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang mRenderer = new Renderer( 1966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAudioSink, 1976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn new AMessage(kWhatRendererNotify, id())); 1984cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner 1996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn looper()->registerHandler(mRenderer); 2006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn postScanSources(); 2026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn break; 2036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn case kWhatScanSources: 2069302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown { 2070bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski int32_t generation; 20892fc37294c474fd47b4439736c6cf700c4e46a27Wale Ogunwale CHECK(msg->findInt32("generation", &generation)); 2099302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (generation != mScanSourcesGeneration) { 2106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Drop obsolete msg. 2116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn break; 2128e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang } 2136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mScanSourcesPending = false; 2158e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang 2166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn LOGV("scanning sources haveAudio=%d, haveVideo=%d", 2176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAudioDecoder != NULL, mVideoDecoder != NULL); 2184cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner 2196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn instantiateDecoder(false, &mVideoDecoder); 220bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown 2216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mAudioSink != NULL) { 2225fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn instantiateDecoder(true, &mAudioDecoder); 2235fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn } 224ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown 225ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown if (!mSource->feedMoreTSData()) { 226ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 2276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // We're not currently decoding anything (no audio or 2286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // video tracks found) and we just ran out of input data. 2296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 2306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 231ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown break; 232ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown } 233ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown 234ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 235ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown msg->post(100000ll); 2360bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski mScanSourcesPending = true; 237bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown } 238bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown break; 2395fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn } 2405fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn 2415fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn case kWhatVideoNotify: 2425cd907d3d6ceebf8731ef1f69347cce6f76109e9Wale Ogunwale case kWhatAudioNotify: 2435cd907d3d6ceebf8731ef1f69347cce6f76109e9Wale Ogunwale { 2445fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn bool audio = msg->what() == kWhatAudioNotify; 245ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown 2460bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski sp<AMessage> codecRequest; 247bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown CHECK(msg->findMessage("codec-request", &codecRequest)); 248bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown 249ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown int32_t what; 2500bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski CHECK(codecRequest->findInt32("what", &what)); 251bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown 2529302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (what == ACodec::kWhatFillThisBuffer) { 253ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown status_t err = feedDecoderInputData( 254bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown audio, codecRequest); 2556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (err == -EWOULDBLOCK) { 257f1285916c3ab259b216e5f3da3dba397c8e898b8Wale Ogunwale if (mSource->feedMoreTSData()) { 258f1285916c3ab259b216e5f3da3dba397c8e898b8Wale Ogunwale msg->post(); 259f1285916c3ab259b216e5f3da3dba397c8e898b8Wale Ogunwale } 2606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 26126c0dfed7a0cd54abafdd0ccbb5b757506d51c76Wale Ogunwale } else if (what == ACodec::kWhatEOS) { 26226c0dfed7a0cd54abafdd0ccbb5b757506d51c76Wale Ogunwale mRenderer->queueEOS(audio, ERROR_END_OF_STREAM); 26326c0dfed7a0cd54abafdd0ccbb5b757506d51c76Wale Ogunwale } else if (what == ACodec::kWhatFlushCompleted) { 2647402ddf9b45efc9616676205534ce7b4fc3a13e6Wale Ogunwale bool needShutdown; 2657b0f2e82af35e426f53813ade7ecf493de639623Brian Carlstrom 2667b0f2e82af35e426f53813ade7ecf493de639623Brian Carlstrom if (audio) { 26726c0dfed7a0cd54abafdd0ccbb5b757506d51c76Wale Ogunwale CHECK(IsFlushingState(mFlushingAudio, &needShutdown)); 26826c0dfed7a0cd54abafdd0ccbb5b757506d51c76Wale Ogunwale mFlushingAudio = FLUSHED; 26926c0dfed7a0cd54abafdd0ccbb5b757506d51c76Wale Ogunwale } else { 27026c0dfed7a0cd54abafdd0ccbb5b757506d51c76Wale Ogunwale CHECK(IsFlushingState(mFlushingVideo, &needShutdown)); 2716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mFlushingVideo = FLUSHED; 2725fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn } 2735fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn 2745fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn LOGV("decoder %s flush completed", audio ? "audio" : "video"); 2755fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn 276dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0Sudheer Shanka if (needShutdown) { 277bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown LOGV("initiating %s decoder shutdown", 2785fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn audio ? "audio" : "video"); 2795fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn 2805fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown(); 281def340d45e8795128aab98d9d3cc36bcac58710ebaik.han 2825fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn if (audio) { 2835fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn mFlushingAudio = SHUTTING_DOWN_DECODER; 2845fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn } else { 2856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mFlushingVideo = SHUTTING_DOWN_DECODER; 2866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2897402ddf9b45efc9616676205534ce7b4fc3a13e6Wale Ogunwale finishFlushIfPossible(); 2909302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } else if (what == ACodec::kWhatOutputFormatChanged) { 2919302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (audio) { 2929302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown int32_t numChannels; 2939302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown CHECK(codecRequest->findInt32("channel-count", &numChannels)); 2949302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 2959302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown int32_t sampleRate; 2969302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown CHECK(codecRequest->findInt32("sample-rate", &sampleRate)); 2979302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 2989302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown LOGV("Audio output format changed to %d Hz, %d channels", 2999302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown sampleRate, numChannels); 300e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale 301c08eab81f30a3120ec0929d3508b4a78d498e1ffCraig Mautner mAudioSink->close(); 302053c8e4ef4a8cbc89506b661dd6ef51a301a895cWale Ogunwale CHECK_EQ(mAudioSink->open(sampleRate, numChannels), (status_t)OK); 303a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mAudioSink->start(); 304a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 305053c8e4ef4a8cbc89506b661dd6ef51a301a895cWale Ogunwale mRenderer->signalAudioSinkChanged(); 306a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } else { 307a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // video 308a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 309a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn int32_t width, height; 310a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn CHECK(codecRequest->findInt32("width", &width)); 311a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn CHECK(codecRequest->findInt32("height", &height)); 312a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 313a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn int32_t cropLeft, cropTop, cropRight, cropBottom; 314a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn CHECK(codecRequest->findRect( 315a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn "crop", 316a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn &cropLeft, &cropTop, &cropRight, &cropBottom)); 317a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 318a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn LOGV("Video output format changed to %d x %d " 319a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn "(crop: %d, %d, %d, %d)", 320a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn width, height, 321a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn cropLeft, cropTop, cropRight, cropBottom); 322a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 323a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn notifyListener( 324a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn MEDIA_SET_VIDEO_SIZE, 325a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn cropRight - cropLeft + 1, 326a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn cropBottom - cropTop + 1); 327a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 328a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } else if (what == ACodec::kWhatShutdownCompleted) { 329a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn LOGV("%s shutdown completed", audio ? "audio" : "video"); 330a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (audio) { 331a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mAudioDecoder.clear(); 332a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 333a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER); 334f8a2a632023ef0bafa9c7d5a343cf84d10dbd241Filip Gruszczynski mFlushingAudio = SHUT_DOWN; 3350bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski } else { 336b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang mVideoDecoder.clear(); 337f8a2a632023ef0bafa9c7d5a343cf84d10dbd241Filip Gruszczynski 338e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER); 3393787de16d24001eeb452e1c711d4290a396e67c9Vladislav Kaznacheev mFlushingVideo = SHUT_DOWN; 3403787de16d24001eeb452e1c711d4290a396e67c9Vladislav Kaznacheev } 3413787de16d24001eeb452e1c711d4290a396e67c9Vladislav Kaznacheev 342a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn finishFlushIfPossible(); 343a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } else { 3449302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer); 3459302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 3469302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown renderBuffer(audio, codecRequest); 3479302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 3483787de16d24001eeb452e1c711d4290a396e67c9Vladislav Kaznacheev 3496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn break; 3506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3516213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale 3526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn case kWhatRendererNotify: 3536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn { 3546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int32_t what; 3556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn CHECK(msg->findInt32("what", &what)); 3566213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale 3576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (what == Renderer::kWhatEOS) { 3586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int32_t audio; 3596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn CHECK(msg->findInt32("audio", &audio)); 3606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (audio) { 3620bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski mAudioEOS = true; 3639302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } else { 3646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mVideoEOS = true; 3656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn LOGV("reached %s EOS", audio ? "audio" : "video"); 3686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if ((mAudioEOS || mAudioDecoder == NULL) 370e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale && (mVideoEOS || mVideoDecoder == NULL)) { 3716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 3726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3730bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski } else if (what == Renderer::kWhatPosition) { 3740bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski int64_t positionUs; 3756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn CHECK(msg->findInt64("positionUs", &positionUs)); 37664b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev 377cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown if (mDriver != NULL) { 378e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale sp<NuPlayerDriver> driver = mDriver.promote(); 379cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown if (driver != NULL) { 3800bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski driver->notifyPosition(positionUs); 381cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown } 382cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown } 3836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else { 3846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete); 3858e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang 3868e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang int32_t audio; 3870bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski CHECK(msg->findInt32("audio", &audio)); 3880bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski 3898e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang LOGV("renderer %s flush completed.", audio ? "audio" : "video"); 3908e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang } 3918e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang break; 392e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale } 3938e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang 3940bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski case kWhatMoreDataQueued: 3958e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang { 3968e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang break; 3978e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang } 3988e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang 39983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown case kWhatReset: 4001e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale { 4010d50d8660dac35f7eceb5d74756de0417095b427Vladislav Kaznacheev LOGV("kWhatReset"); 4026213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale 4036213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale if (mFlushingAudio != NONE || mFlushingVideo != NONE) { 4046213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale // We're currently flushing, postpone the reset until that's 4056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // completed. 4060b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown 4076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn LOGV("postponing reset"); 4085406e7ade87c33f70c83a283781dcc48fb67cdb9Andrii Kulian 4095406e7ade87c33f70c83a283781dcc48fb67cdb9Andrii Kulian mResetPostponed = true; 4106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn break; 4116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 4146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn finishReset(); 4156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn break; 4166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mAudioDecoder != NULL) { 4196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn flushDecoder(true /* audio */, true /* needShutdown */); 4206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mVideoDecoder != NULL) { 4236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn flushDecoder(false /* audio */, true /* needShutdown */); 4246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mResetInProgress = true; 4276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn break; 4286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn case kWhatSeek: 4316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn { 4326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int64_t seekTimeUs; 4330b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 4346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn LOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)", 4366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn seekTimeUs, seekTimeUs / 1E6); 4375845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner 4383818c9261ceaa3a700ff984fbcd245faeede38d7Michael Wright mSource->seekTo(seekTimeUs); 4393818c9261ceaa3a700ff984fbcd245faeede38d7Michael Wright 4403818c9261ceaa3a700ff984fbcd245faeede38d7Michael Wright if (mDriver != NULL) { 4413818c9261ceaa3a700ff984fbcd245faeede38d7Michael Wright sp<NuPlayerDriver> driver = mDriver.promote(); 4423818c9261ceaa3a700ff984fbcd245faeede38d7Michael Wright if (driver != NULL) { 4433818c9261ceaa3a700ff984fbcd245faeede38d7Michael Wright driver->notifySeekComplete(); 4446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4460b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown 447037c33eae74bee2774897d969d48947f9abe254fJeff Brown break; 448037c33eae74bee2774897d969d48947f9abe254fJeff Brown } 4496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 45056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown case kWhatPause: 45170af00abf73160235d4efe114fcf4753007a8ff3Michael Wright { 45270af00abf73160235d4efe114fcf4753007a8ff3Michael Wright CHECK(mRenderer != NULL); 45356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown mRenderer->pause(); 4540b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown break; 45570af00abf73160235d4efe114fcf4753007a8ff3Michael Wright } 45670af00abf73160235d4efe114fcf4753007a8ff3Michael Wright 45770af00abf73160235d4efe114fcf4753007a8ff3Michael Wright case kWhatResume: 45856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown { 45956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown CHECK(mRenderer != NULL); 4606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mRenderer->resume(); 4616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn break; 4620b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown } 463905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown 4646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn default: 4656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn TRESPASS(); 4666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn break; 4676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4685845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner} 4696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornvoid NuPlayer::finishFlushIfPossible() { 4710b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) { 4726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return; 4736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) { 4766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return; 4774532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown } 4784532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown 4790b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown LOGV("both audio and video are flushed now."); 4804532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown 4815cd907d3d6ceebf8731ef1f69347cce6f76109e9Wale Ogunwale mRenderer->signalTimeDiscontinuity(); 4824532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown 4834532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown if (mAudioDecoder != NULL) { 4844532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown mAudioDecoder->signalResume(); 4854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown } 4866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mVideoDecoder != NULL) { 4886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mVideoDecoder->signalResume(); 4896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 490f8a2a632023ef0bafa9c7d5a343cf84d10dbd241Filip Gruszczynski 4910bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski mFlushingAudio = NONE; 4926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mFlushingVideo = NONE; 4936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mResetInProgress) { 4956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn LOGV("reset completed"); 4966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mResetInProgress = false; 4986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn finishReset(); 4996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else if (mResetPostponed) { 5006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn (new AMessage(kWhatReset, id()))->post(); 5016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mResetPostponed = false; 5026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 5036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn postScanSources(); 5046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 5056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn} 5066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornvoid NuPlayer::finishReset() { 5086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn CHECK(mAudioDecoder == NULL); 5096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn CHECK(mVideoDecoder == NULL); 5105845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner 5116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mRenderer.clear(); 5126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSource.clear(); 5136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mDriver != NULL) { 5156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn sp<NuPlayerDriver> driver = mDriver.promote(); 5169302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (driver != NULL) { 5179302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown driver->notifyResetComplete(); 51872919d2c310db04fdb860e926ccb0bfe6e3aef08Wale Ogunwale } 5196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 5209302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown} 5216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornvoid NuPlayer::postScanSources() { 5235845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner if (mScanSourcesPending) { 5246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return; 5256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 526f8a2a632023ef0bafa9c7d5a343cf84d10dbd241Filip Gruszczynski 5270bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski sp<AMessage> msg = new AMessage(kWhatScanSources, id()); 5286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn msg->setInt32("generation", mScanSourcesGeneration); 5298e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang msg->post(); 5306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mScanSourcesPending = true; 5326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn} 5336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5348e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhangstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) { 5356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (*decoder != NULL) { 5366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return OK; 537f8a2a632023ef0bafa9c7d5a343cf84d10dbd241Filip Gruszczynski } 5380bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski 5396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn sp<MetaData> meta = mSource->getFormat(audio); 5408e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang 5416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (meta == NULL) { 5426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return -EWOULDBLOCK; 5436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 5446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5458e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang sp<AMessage> notify = 5466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify, 547e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale id()); 548f8a2a632023ef0bafa9c7d5a343cf84d10dbd241Filip Gruszczynski 5490bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski *decoder = audio ? new Decoder(notify) : 5506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn new Decoder(notify, mNativeWindow); 5518e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang looper()->registerHandler(*decoder); 5526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 553e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale (*decoder)->configure(meta); 554e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale 555e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale int64_t durationUs; 556e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 5576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn sp<NuPlayerDriver> driver = mDriver.promote(); 5586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (driver != NULL) { 5596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn driver->notifyDuration(durationUs); 5608e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang } 5616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 5626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 563f8a2a632023ef0bafa9c7d5a343cf84d10dbd241Filip Gruszczynski return OK; 5640bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski} 5656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5668e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhangstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { 5676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn sp<AMessage> reply; 568e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale CHECK(msg->findMessage("reply", &reply)); 5696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if ((audio && IsFlushingState(mFlushingAudio)) 5716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn || (!audio && IsFlushingState(mFlushingVideo))) { 5728e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang reply->setInt32("err", INFO_DISCONTINUITY); 5736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn reply->post(); 5746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return OK; 575f8a2a632023ef0bafa9c7d5a343cf84d10dbd241Filip Gruszczynski } 5760bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski 5776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn sp<ABuffer> accessUnit; 5788e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang status_t err = mSource->dequeueAccessUnit(audio, &accessUnit); 5796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (err == -EWOULDBLOCK) { 5816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return err; 5826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else if (err != OK) { 5838e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang if (err == INFO_DISCONTINUITY) { 5846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int32_t type; 5856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn CHECK(accessUnit->meta()->findInt32("discontinuity", &type)); 5866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 587e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale bool formatChange = 588e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale type == ATSParser::DISCONTINUITY_FORMATCHANGE; 589e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale 590e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale LOGV("%s discontinuity (formatChange=%d)", 591e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale audio ? "audio" : "video", formatChange); 592853c99a083dc6a96694373c48f427e4d3466d4a9Winson Chung 593853c99a083dc6a96694373c48f427e4d3466d4a9Winson Chung if (audio) { 594853c99a083dc6a96694373c48f427e4d3466d4a9Winson Chung mSkipRenderingAudioUntilMediaTimeUs = -1; 595853c99a083dc6a96694373c48f427e4d3466d4a9Winson Chung } else { 596853c99a083dc6a96694373c48f427e4d3466d4a9Winson Chung mSkipRenderingVideoUntilMediaTimeUs = -1; 597853c99a083dc6a96694373c48f427e4d3466d4a9Winson Chung } 598853c99a083dc6a96694373c48f427e4d3466d4a9Winson Chung 599e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale sp<AMessage> extra; 6001e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale if (accessUnit->meta()->findMessage("extra", &extra) 6011e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale && extra != NULL) { 6021e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale int64_t resumeAtMediaTimeUs; 6031e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale if (extra->findInt64( 6041e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) { 6051e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale LOGI("suppressing rendering of %s until %lld us", 6061e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale audio ? "audio" : "video", resumeAtMediaTimeUs); 6071e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 6081e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale if (audio) { 6091e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale mSkipRenderingAudioUntilMediaTimeUs = 6101e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale resumeAtMediaTimeUs; 6111e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale } else { 6121e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale mSkipRenderingVideoUntilMediaTimeUs = 6131e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale resumeAtMediaTimeUs; 6141e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale } 6151e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale } 6161e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale } 6171e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 6181e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale flushDecoder(audio, formatChange); 6191e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale } 6201e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 6211e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale reply->setInt32("err", err); 6221e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale reply->post(); 6231e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale return OK; 6241e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale } 6251e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 6261e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale // LOGV("returned a valid buffer of %s data", audio ? "audio" : "video"); 6271e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 6281e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale#if 0 6291e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale int64_t mediaTimeUs; 6301e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs)); 6311e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale LOGV("feeding %s input buffer at media time %.2f secs", 6323787de16d24001eeb452e1c711d4290a396e67c9Vladislav Kaznacheev audio ? "audio" : "video", 6332e96c63c4ce37514728ad0fc36db0225d6ad97b9Vladislav Kaznacheev mediaTimeUs / 1E6); 6342e96c63c4ce37514728ad0fc36db0225d6ad97b9Vladislav Kaznacheev#endif 6351e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 6361e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale reply->setObject("buffer", accessUnit); 6371e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale reply->post(); 6381e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 6391e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale return OK; 6401e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale} 6411e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 642e15352e516fb6ecde12866f0eb27c32470ddbdedMatthew Ngvoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { 6431e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale // LOGV("renderBuffer %s", audio ? "audio" : "video"); 6441e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 6451e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale sp<AMessage> reply; 6461e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale CHECK(msg->findMessage("reply", &reply)); 64761ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung 64861ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung sp<RefBase> obj; 64961ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung CHECK(msg->findObject("buffer", &obj)); 65061ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung 65161ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get()); 65261ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung 65361ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung int64_t &skipUntilMediaTimeUs = 65461ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung audio 65561ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung ? mSkipRenderingAudioUntilMediaTimeUs 65661ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung : mSkipRenderingVideoUntilMediaTimeUs; 65761ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung 65861ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung if (skipUntilMediaTimeUs >= 0) { 65961ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung int64_t mediaTimeUs; 66061ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs)); 66161ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung 66261ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung if (mediaTimeUs < skipUntilMediaTimeUs) { 66361ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung LOGV("dropping %s buffer at time %lld as requested.", 66461ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung audio ? "audio" : "video", 66561ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung mediaTimeUs); 66661ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung 6671e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale reply->post(); 6681e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale return; 6691e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale } 6701e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 6711e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale skipUntilMediaTimeUs = -1; 6721e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale } 6731e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 6741e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale mRenderer->queueBuffer(audio, buffer, reply); 6751e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale} 6761e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 6771e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwalevoid NuPlayer::notifyListener(int msg, int ext1, int ext2) { 6781e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale if (mDriver == NULL) { 6791e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale return; 6801e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale } 6811e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 6821e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale sp<NuPlayerDriver> driver = mDriver.promote(); 6831e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 6841e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale if (driver == NULL) { 6851e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale return; 6861e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale } 6871e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 6881e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale driver->sendEvent(msg, ext1, ext2); 6891e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale} 6901e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 6911e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwalevoid NuPlayer::flushDecoder(bool audio, bool needShutdown) { 6921e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale // Make sure we don't continue to scan sources until we finish flushing. 6931e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale ++mScanSourcesGeneration; 6941e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale mScanSourcesPending = false; 6951e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 6961e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale (audio ? mAudioDecoder : mVideoDecoder)->signalFlush(); 6971e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale mRenderer->flush(audio); 6981e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 6991e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale FlushStatus newStatus = 700ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 701 702 if (audio) { 703 CHECK(mFlushingAudio == NONE 704 || mFlushingAudio == AWAITING_DISCONTINUITY); 705 706 mFlushingAudio = newStatus; 707 708 if (mFlushingVideo == NONE) { 709 mFlushingVideo = (mVideoDecoder != NULL) 710 ? AWAITING_DISCONTINUITY 711 : FLUSHED; 712 } 713 } else { 714 CHECK(mFlushingVideo == NONE 715 || mFlushingVideo == AWAITING_DISCONTINUITY); 716 717 mFlushingVideo = newStatus; 718 719 if (mFlushingAudio == NONE) { 720 mFlushingAudio = (mAudioDecoder != NULL) 721 ? AWAITING_DISCONTINUITY 722 : FLUSHED; 723 } 724 } 725} 726 727} // namespace android 728