NuPlayerStreamListener.cpp revision 32f3cefa373cd55e63deda36ca9d07c7fe22eaaf
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 "NuPlayerStreamListener"
19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Log.h>
20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerStreamListener.h"
22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <binder/MemoryDealer.h>
24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h>
255bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/foundation/AMessage.h>
265bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/MediaErrors.h>
27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
28f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
30f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayerStreamListener::NuPlayerStreamListener(
31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        const sp<IStreamSource> &source,
32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        ALooper::handler_id id)
33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : mSource(source),
34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mTargetID(id),
35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mEOS(false),
36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mSendDataNotification(true) {
37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mSource->setListener(this);
38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mMemoryDealer = new MemoryDealer(kNumBuffers * kBufferSize);
40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < kNumBuffers; ++i) {
41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        sp<IMemory> mem = mMemoryDealer->allocate(kBufferSize);
42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK(mem != NULL);
43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mBuffers.push(mem);
45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mSource->setBuffers(mBuffers);
47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
49f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::NuPlayerStreamListener::start() {
50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < kNumBuffers; ++i) {
51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mSource->onBufferAvailable(i);
52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
55f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::NuPlayerStreamListener::queueBuffer(size_t index, size_t size) {
56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    QueueEntry entry;
57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    entry.mIsCommand = false;
58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    entry.mIndex = index;
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    entry.mSize = size;
60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    entry.mOffset = 0;
61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    Mutex::Autolock autoLock(mLock);
63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mQueue.push_back(entry);
64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mSendDataNotification) {
66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mSendDataNotification = false;
675bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        if (mTargetID != 0) {
695bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            (new AMessage(kWhatMoreDataQueued, mTargetID))->post();
705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        }
71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
74f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::NuPlayerStreamListener::issueCommand(
75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        Command cmd, bool synchronous, const sp<AMessage> &extra) {
76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(!synchronous);
77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    QueueEntry entry;
79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    entry.mIsCommand = true;
80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    entry.mCommand = cmd;
81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    entry.mExtra = extra;
82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    Mutex::Autolock autoLock(mLock);
84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mQueue.push_back(entry);
85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mSendDataNotification) {
87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mSendDataNotification = false;
885bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
895bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        if (mTargetID != 0) {
905bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            (new AMessage(kWhatMoreDataQueued, mTargetID))->post();
915bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        }
92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
9532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huberssize_t NuPlayer::NuPlayerStreamListener::read(
9632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        void *data, size_t size, sp<AMessage> *extra) {
97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_GT(size, 0u);
98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
9932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    extra->clear();
10032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    Mutex::Autolock autoLock(mLock);
102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mEOS) {
104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return 0;
105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mQueue.empty()) {
108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mSendDataNotification = true;
109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return -EWOULDBLOCK;
111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    QueueEntry *entry = &*mQueue.begin();
114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (entry->mIsCommand) {
116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        switch (entry->mCommand) {
117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            case EOS:
118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            {
119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mQueue.erase(mQueue.begin());
120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                entry = NULL;
121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mEOS = true;
123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                return 0;
124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            case DISCONTINUITY:
127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            {
12832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                *extra = entry->mExtra;
12932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mQueue.erase(mQueue.begin());
131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                entry = NULL;
132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                return INFO_DISCONTINUITY;
134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            default:
137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                TRESPASS();
138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    size_t copy = entry->mSize;
143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (copy > size) {
144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        copy = size;
145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    memcpy(data,
148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber           (const uint8_t *)mBuffers.editItemAt(entry->mIndex)->pointer()
149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            + entry->mOffset,
150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber           copy);
151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    entry->mOffset += copy;
153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    entry->mSize -= copy;
154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (entry->mSize == 0) {
156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mSource->onBufferAvailable(entry->mIndex);
157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mQueue.erase(mQueue.begin());
158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        entry = NULL;
159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return copy;
162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
165