NuPlayerRenderer.cpp revision 5bc087c573c70c84c6a39946457590b42d392a33
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 "NuPlayerRenderer"
19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Log.h>
20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerRenderer.h"
22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h>
255bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/foundation/AMessage.h>
26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
27f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
29f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::Renderer::Renderer(
30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        const sp<MediaPlayerBase::AudioSink> &sink,
31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        const sp<AMessage> &notify)
32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : mAudioSink(sink),
33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mNotify(notify),
34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mNumFramesWritten(0),
35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mDrainAudioQueuePending(false),
36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mDrainVideoQueuePending(false),
37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mAudioQueueGeneration(0),
38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mVideoQueueGeneration(0),
39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mAnchorTimeMediaUs(-1),
40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mAnchorTimeRealUs(-1),
41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mFlushingAudio(false),
42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mFlushingVideo(false),
433831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber      mHasAudio(mAudioSink != NULL),
443831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber      mHasVideo(true),
453831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber      mSyncQueues(mHasAudio && mHasVideo) {
46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
48f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::Renderer::~Renderer() {
49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
51f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::queueBuffer(
52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        bool audio,
53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        const sp<ABuffer> &buffer,
54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        const sp<AMessage> &notifyConsumed) {
55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatQueueBuffer, id());
56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setInt32("audio", static_cast<int32_t>(audio));
57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setObject("buffer", buffer);
58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setMessage("notifyConsumed", notifyConsumed);
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
62f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::queueEOS(bool audio, status_t finalResult) {
63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_NE(finalResult, (status_t)OK);
64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatQueueEOS, id());
66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setInt32("audio", static_cast<int32_t>(audio));
67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setInt32("finalResult", finalResult);
68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
71f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::flush(bool audio) {
72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    {
73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        Mutex::Autolock autoLock(mFlushLock);
74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (audio) {
75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(!mFlushingAudio);
76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mFlushingAudio = true;
77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        } else {
78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(!mFlushingVideo);
79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mFlushingVideo = true;
80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatFlush, id());
84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setInt32("audio", static_cast<int32_t>(audio));
85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
88f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::signalTimeDiscontinuity() {
89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(mAudioQueue.empty());
90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(mVideoQueue.empty());
91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mAnchorTimeMediaUs = -1;
92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mAnchorTimeRealUs = -1;
933831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mSyncQueues = mHasAudio && mHasVideo;
94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
96f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatDrainAudioQueue:
99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t generation;
101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("generation", &generation));
102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (generation != mAudioQueueGeneration) {
103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mDrainAudioQueuePending = false;
107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            onDrainAudioQueue();
109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            postDrainAudioQueue();
111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatDrainVideoQueue:
115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t generation;
117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("generation", &generation));
118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (generation != mVideoQueueGeneration) {
119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mDrainVideoQueuePending = false;
123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            onDrainVideoQueue();
125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            postDrainVideoQueue();
127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatQueueBuffer:
131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            onQueueBuffer(msg);
133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatQueueEOS:
137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            onQueueEOS(msg);
139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatFlush:
143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            onFlush(msg);
145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1483831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        case kWhatAudioSinkChanged:
1493831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        {
1503831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber            onAudioSinkChanged();
1513831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber            break;
1523831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        }
1533831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            TRESPASS();
156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
160f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::postDrainAudioQueue() {
161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mDrainAudioQueuePending || mSyncQueues) {
162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mAudioQueue.empty()) {
166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mDrainAudioQueuePending = true;
170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatDrainAudioQueue, id());
171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setInt32("generation", mAudioQueueGeneration);
172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post(10000);
173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1753831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::Renderer::signalAudioSinkChanged() {
1763831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    (new AMessage(kWhatAudioSinkChanged, id()))->post();
1773831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber}
1783831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
179f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::onDrainAudioQueue() {
180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    uint32_t numFramesPlayed;
181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(mAudioSink->getPosition(&numFramesPlayed), (status_t)OK);
182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    ssize_t numFramesAvailableToWrite =
184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mAudioSink->frameCount() - (mNumFramesWritten - numFramesPlayed);
185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_GE(numFramesAvailableToWrite, 0);
187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    size_t numBytesAvailableToWrite =
189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        numFramesAvailableToWrite * mAudioSink->frameSize();
190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    while (numBytesAvailableToWrite > 0) {
192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (mAudioQueue.empty()) {
193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        QueueEntry *entry = &*mAudioQueue.begin();
197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (entry->mBuffer == NULL) {
199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            // EOS
200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            notifyEOS(true /* audio */);
202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mAudioQueue.erase(mAudioQueue.begin());
204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            entry = NULL;
205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return;
206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (entry->mOffset == 0) {
209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int64_t mediaTimeUs;
210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(entry->mBuffer->meta()->findInt64("timeUs", &mediaTimeUs));
211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            LOGV("rendering audio at media time %.2f secs", mediaTimeUs / 1E6);
213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mAnchorTimeMediaUs = mediaTimeUs;
215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            uint32_t numFramesPlayed;
217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(mAudioSink->getPosition(&numFramesPlayed), (status_t)OK);
218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            uint32_t numFramesPendingPlayout =
220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mNumFramesWritten - numFramesPlayed;
221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int64_t realTimeOffsetUs =
223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                (mAudioSink->latency() / 2  /* XXX */
224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    + numFramesPendingPlayout
225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        * mAudioSink->msecsPerFrame()) * 1000ll;
226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            // LOGI("realTimeOffsetUs = %lld us", realTimeOffsetUs);
228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mAnchorTimeRealUs =
230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                ALooper::GetNowUs() + realTimeOffsetUs;
231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        size_t copy = entry->mBuffer->size() - entry->mOffset;
234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (copy > numBytesAvailableToWrite) {
235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            copy = numBytesAvailableToWrite;
236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK_EQ(mAudioSink->write(
239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    entry->mBuffer->data() + entry->mOffset, copy),
240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                 (ssize_t)copy);
241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        entry->mOffset += copy;
243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (entry->mOffset == entry->mBuffer->size()) {
244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            entry->mNotifyConsumed->post();
245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mAudioQueue.erase(mAudioQueue.begin());
246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            entry = NULL;
247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        numBytesAvailableToWrite -= copy;
250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mNumFramesWritten += copy / mAudioSink->frameSize();
251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
254f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::postDrainVideoQueue() {
255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mDrainVideoQueuePending || mSyncQueues) {
256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mVideoQueue.empty()) {
260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    QueueEntry &entry = *mVideoQueue.begin();
264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatDrainVideoQueue, id());
266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setInt32("generation", mVideoQueueGeneration);
267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t delayUs;
269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (entry.mBuffer == NULL) {
271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // EOS doesn't carry a timestamp.
272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        delayUs = 0;
273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else {
274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        int64_t mediaTimeUs;
275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK(entry.mBuffer->meta()->findInt64("timeUs", &mediaTimeUs));
276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (mAnchorTimeMediaUs < 0) {
278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            delayUs = 0;
279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2803831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber            if (!mHasAudio) {
281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mAnchorTimeMediaUs = mediaTimeUs;
282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mAnchorTimeRealUs = ALooper::GetNowUs();
283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        } else {
285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int64_t realTimeUs =
286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                (mediaTimeUs - mAnchorTimeMediaUs) + mAnchorTimeRealUs;
287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            delayUs = realTimeUs - ALooper::GetNowUs();
289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post(delayUs);
293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mDrainVideoQueuePending = true;
295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
297f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::onDrainVideoQueue() {
298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mVideoQueue.empty()) {
299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    QueueEntry *entry = &*mVideoQueue.begin();
303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (entry->mBuffer == NULL) {
305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // EOS
306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        notifyEOS(false /* audio */);
308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mVideoQueue.erase(mVideoQueue.begin());
310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        entry = NULL;
311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0
315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t mediaTimeUs;
316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(entry->mBuffer->meta()->findInt64("timeUs", &mediaTimeUs));
317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGI("rendering video at media time %.2f secs", mediaTimeUs / 1E6);
319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif
320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    entry->mNotifyConsumed->setInt32("render", true);
322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    entry->mNotifyConsumed->post();
323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mVideoQueue.erase(mVideoQueue.begin());
324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    entry = NULL;
325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
327f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::notifyEOS(bool audio) {
328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notify = mNotify->dup();
329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    notify->setInt32("what", kWhatEOS);
330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    notify->setInt32("audio", static_cast<int32_t>(audio));
331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    notify->post();
332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
334f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::onQueueBuffer(const sp<AMessage> &msg) {
335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int32_t audio;
336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findInt32("audio", &audio));
337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (dropBufferWhileFlushing(audio, msg)) {
339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<RefBase> obj;
343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findObject("buffer", &obj));
344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get());
345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notifyConsumed;
347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("notifyConsumed", &notifyConsumed));
348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    QueueEntry entry;
350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    entry.mBuffer = buffer;
351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    entry.mNotifyConsumed = notifyConsumed;
352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    entry.mOffset = 0;
353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    entry.mFinalResult = OK;
354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (audio) {
356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mAudioQueue.push_back(entry);
357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        postDrainAudioQueue();
358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else {
359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mVideoQueue.push_back(entry);
360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        postDrainVideoQueue();
361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mSyncQueues && !mAudioQueue.empty() && !mVideoQueue.empty()) {
364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        int64_t firstAudioTimeUs;
365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        int64_t firstVideoTimeUs;
366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK((*mAudioQueue.begin()).mBuffer->meta()
367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                ->findInt64("timeUs", &firstAudioTimeUs));
368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK((*mVideoQueue.begin()).mBuffer->meta()
369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                ->findInt64("timeUs", &firstVideoTimeUs));
370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        int64_t diff = firstVideoTimeUs - firstAudioTimeUs;
372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        LOGV("queueDiff = %.2f secs", diff / 1E6);
374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (diff > 100000ll) {
376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            // Audio data starts More than 0.1 secs before video.
377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            // Drop some audio.
378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            (*mAudioQueue.begin()).mNotifyConsumed->post();
380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mAudioQueue.erase(mAudioQueue.begin());
381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return;
382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        syncQueuesDone();
385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
388f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::syncQueuesDone() {
389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (!mSyncQueues) {
390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mSyncQueues = false;
394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (!mAudioQueue.empty()) {
396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        postDrainAudioQueue();
397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (!mVideoQueue.empty()) {
400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        postDrainVideoQueue();
401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
404f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::onQueueEOS(const sp<AMessage> &msg) {
405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int32_t audio;
406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findInt32("audio", &audio));
407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (dropBufferWhileFlushing(audio, msg)) {
409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int32_t finalResult;
413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findInt32("finalResult", &finalResult));
414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    QueueEntry entry;
416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    entry.mOffset = 0;
417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    entry.mFinalResult = finalResult;
418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (audio) {
420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mAudioQueue.push_back(entry);
421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        postDrainAudioQueue();
422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else {
423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mVideoQueue.push_back(entry);
424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        postDrainVideoQueue();
425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
428f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::onFlush(const sp<AMessage> &msg) {
429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int32_t audio;
430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findInt32("audio", &audio));
431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // If we're currently syncing the queues, i.e. dropping audio while
433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // aligning the first audio/video buffer times and only one of the
434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // two queues has data, we may starve that queue by not requesting
435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // more buffers from the decoder. If the other source then encounters
436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // a discontinuity that leads to flushing, we'll never find the
437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // corresponding discontinuity on the other queue.
438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // Therefore we'll stop syncing the queues if at least one of them
439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // is flushed.
440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    syncQueuesDone();
441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (audio) {
443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        flushQueue(&mAudioQueue);
444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        Mutex::Autolock autoLock(mFlushLock);
446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mFlushingAudio = false;
447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mDrainAudioQueuePending = false;
449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        ++mAudioQueueGeneration;
450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else {
451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        flushQueue(&mVideoQueue);
452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        Mutex::Autolock autoLock(mFlushLock);
454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mFlushingVideo = false;
455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mDrainVideoQueuePending = false;
457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        ++mVideoQueueGeneration;
458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    notifyFlushComplete(audio);
461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
463f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::flushQueue(List<QueueEntry> *queue) {
464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    while (!queue->empty()) {
465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        QueueEntry *entry = &*queue->begin();
466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (entry->mBuffer != NULL) {
468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            entry->mNotifyConsumed->post();
469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        queue->erase(queue->begin());
472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        entry = NULL;
473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
474f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
476f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::notifyFlushComplete(bool audio) {
477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notify = mNotify->dup();
478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    notify->setInt32("what", kWhatFlushComplete);
479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    notify->setInt32("audio", static_cast<int32_t>(audio));
480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    notify->post();
481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
483f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool NuPlayer::Renderer::dropBufferWhileFlushing(
484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        bool audio, const sp<AMessage> &msg) {
485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool flushing = false;
486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    {
488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        Mutex::Autolock autoLock(mFlushLock);
489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (audio) {
490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            flushing = mFlushingAudio;
491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        } else {
492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            flushing = mFlushingVideo;
493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
495f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (!flushing) {
497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return false;
498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notifyConsumed;
501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (msg->findMessage("notifyConsumed", &notifyConsumed)) {
502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        notifyConsumed->post();
503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return true;
506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5083831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::Renderer::onAudioSinkChanged() {
5093831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    CHECK(!mDrainAudioQueuePending);
5103831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mNumFramesWritten = 0;
5113831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber}
5123831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
515