NuPlayerDecoderBase.cpp revision 7137ec7e005a5a6e3c0edb91cfacf16a31f4bf6a
1bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski/*
2bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski * Copyright (C) 2010 The Android Open Source Project
3bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski *
4bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski * Licensed under the Apache License, Version 2.0 (the "License");
5bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski * you may not use this file except in compliance with the License.
6bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski * You may obtain a copy of the License at
7bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski *
8bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski *      http://www.apache.org/licenses/LICENSE-2.0
9bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski *
10bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski * Unless required by applicable law or agreed to in writing, software
11bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski * distributed under the License is distributed on an "AS IS" BASIS,
12bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski * See the License for the specific language governing permissions and
140fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski * limitations under the License.
15bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski */
16bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
17bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski//#define LOG_NDEBUG 0
18bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski#define LOG_TAG "NuPlayerDecoderBase"
19f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius#include <utils/Log.h>
20f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius#include <inttypes.h>
21f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius
22f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius#include "NuPlayerDecoderBase.h"
23f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius
24f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius#include "NuPlayerRenderer.h"
25f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius
26bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski#include <media/stagefright/foundation/ADebug.h>
275d3609b1931180c37d7292619146ad7d33df9a21Roshan Pius#include <media/stagefright/foundation/AMessage.h>
28bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
29f918b154ddceb58c3d214d75ad02180d1907429aRoshan Piusnamespace android {
30bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
31f918b154ddceb58c3d214d75ad02180d1907429aRoshan PiusNuPlayer::DecoderBase::DecoderBase()
32f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius    : mRequestInputBuffersPending(false) {
33e33a4bb414892435c016486585c26022cafdab68Roshan Pius    // Every decoder has its own looper because MediaCodec operations
34bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    // are blocking, but NuPlayer needs asynchronous operations.
35bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    mDecoderLooper = new ALooper;
36bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    mDecoderLooper->setName("NPDecoder");
370fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    mDecoderLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
38b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe}
39b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe
40b50356194ccfdaf5e127d9f705f99713d6f1e98cxinheNuPlayer::DecoderBase::~DecoderBase() {
41b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe    mDecoderLooper->unregisterHandler(id());
42b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe    mDecoderLooper->stop();
43b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe}
44b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe
45b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhestatic
46b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhestatus_t PostAndAwaitResponse(
470fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        const sp<AMessage> &msg, sp<AMessage> *response) {
48f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius    status_t err = msg->postAndAwaitResponse(response);
49f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius
50f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius    if (err != OK) {
51f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius        return err;
52f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius    }
53f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius
54f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius    if (!(*response)->findInt32("err", &err)) {
55f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius        err = OK;
56f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius    }
57f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius
58f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius    return err;
59f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius}
60f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius
61f03d366f869da748d97706dbcfbd30b989186f4eRoshan Piusvoid NuPlayer::DecoderBase::configure(const sp<AMessage> &format) {
62f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius    sp<AMessage> msg = new AMessage(kWhatConfigure, id());
63f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius    msg->setMessage("format", format);
64f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius    msg->post();
65f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius}
66f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius
67f03d366f869da748d97706dbcfbd30b989186f4eRoshan Piusvoid NuPlayer::DecoderBase::init() {
68f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius    mDecoderLooper->registerHandler(this);
69f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius}
70f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius
71f03d366f869da748d97706dbcfbd30b989186f4eRoshan Piusvoid NuPlayer::DecoderBase::setRenderer(const sp<Renderer> &renderer) {
72f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius    sp<AMessage> msg = new AMessage(kWhatSetRenderer, id());
73f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius    msg->setObject("renderer", renderer);
74f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius    msg->post();
75f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius}
76f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius
77f03d366f869da748d97706dbcfbd30b989186f4eRoshan Piusstatus_t NuPlayer::DecoderBase::getInputBuffers(Vector<sp<ABuffer> > *buffers) const {
78f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius    sp<AMessage> msg = new AMessage(kWhatGetInputBuffers, id());
79f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius    msg->setPointer("buffers", buffers);
80f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius
81f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius    sp<AMessage> response;
82f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius    return PostAndAwaitResponse(msg, &response);
83f03d366f869da748d97706dbcfbd30b989186f4eRoshan Pius}
84f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius
85f918b154ddceb58c3d214d75ad02180d1907429aRoshan Piusvoid NuPlayer::DecoderBase::signalFlush() {
860fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    (new AMessage(kWhatFlush, id()))->post();
870fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski}
880fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
890fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskivoid NuPlayer::DecoderBase::signalResume() {
900fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    (new AMessage(kWhatResume, id()))->post();
910fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski}
920fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
930fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskivoid NuPlayer::DecoderBase::initiateShutdown() {
940fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    (new AMessage(kWhatShutdown, id()))->post();
950fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski}
96bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
97bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowskivoid NuPlayer::DecoderBase::onRequestInputBuffers() {
98bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    if (mRequestInputBuffersPending) {
99bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        return;
100bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
101bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
102bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    doRequestBuffers();
103bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski}
104bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
105bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowskivoid NuPlayer::DecoderBase::scheduleRequestBuffers() {
106bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    if (mRequestInputBuffersPending) {
107bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        return;
108bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
109bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    mRequestInputBuffersPending = true;
110bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    sp<AMessage> msg = new AMessage(kWhatRequestInputBuffers, id());
111bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    msg->post(10 * 1000ll);
112b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe}
1130fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
1140fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskivoid NuPlayer::DecoderBase::onMessageReceived(const sp<AMessage> &msg) {
1150fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
1160fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    switch (msg->what()) {
1170fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        case kWhatConfigure:
1180fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        {
1190fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski            sp<AMessage> format;
1200fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski            CHECK(msg->findMessage("format", &format));
1210fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski            onConfigure(format);
1220fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski            break;
1230fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        }
1240fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
125b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe        case kWhatSetRenderer:
126b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe        {
127b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe            sp<RefBase> obj;
128b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe            CHECK(msg->findObject("renderer", &obj));
129b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe            onSetRenderer(static_cast<Renderer *>(obj.get()));
130b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe            break;
131b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe        }
132b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe
133b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe        case kWhatGetInputBuffers:
134b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe        {
135b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe            uint32_t replyID;
136b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe            CHECK(msg->senderAwaitsResponse(&replyID));
137b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe
138b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe            Vector<sp<ABuffer> > *dstBuffers;
139b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe            CHECK(msg->findPointer("buffers", (void **)&dstBuffers));
140b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe
141b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe            onGetInputBuffers(dstBuffers);
142b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe
143b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe            (new AMessage)->postReply(replyID);
144b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe            break;
145e33a4bb414892435c016486585c26022cafdab68Roshan Pius        }
146e33a4bb414892435c016486585c26022cafdab68Roshan Pius
147f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius        case kWhatRequestInputBuffers:
148f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius        {
149f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius            mRequestInputBuffersPending = false;
150f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius            onRequestInputBuffers();
151f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius            break;
152f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius        }
153f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius
154f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius        case kWhatFlush:
155f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius        {
156f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius            onFlush(true);
157f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius            break;
158f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius        }
159f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius
160f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius        case kWhatResume:
161f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius        {
162f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius            onResume();
163f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius            break;
164f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius        }
165f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius
166f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius        case kWhatShutdown:
167f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius        {
168f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius            onShutdown(true);
169f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius            break;
170f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius        }
171f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius
172f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius        default:
173f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius            TRESPASS();
174f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius            break;
175f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius    }
176f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius}
177f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius
178f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius}  // namespace android
179f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius
180f918b154ddceb58c3d214d75ad02180d1907429aRoshan Pius