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