StagefrightPlayer.cpp revision d411b4ca2945cd8974a3a78199fce94646950128
1a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon/* 2a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * Copyright (C) 2009 The Android Open Source Project 3a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * 4a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * Licensed under the Apache License, Version 2.0 (the "License"); 5a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * you may not use this file except in compliance with the License. 6a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * You may obtain a copy of the License at 7a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * 8a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * http://www.apache.org/licenses/LICENSE-2.0 9a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * 10a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * Unless required by applicable law or agreed to in writing, software 11a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * distributed under the License is distributed on an "AS IS" BASIS, 12a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * See the License for the specific language governing permissions and 14a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * limitations under the License. 15a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon */ 16a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 17a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon//#define LOG_NDEBUG 0 18a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon#define LOG_TAG "StagefrightPlayer" 19a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon#include <utils/Log.h> 20a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 21a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon#include "StagefrightPlayer.h" 22a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 23a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon#include "AwesomePlayer.h" 2464511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu 25a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon#include <media/Metadata.h> 26a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon#include <media/stagefright/MediaExtractor.h> 2764511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu 2864511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liunamespace android { 2964511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu 30a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan DixonStagefrightPlayer::StagefrightPlayer() 31a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon : mPlayer(new AwesomePlayer) { 32a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon ALOGV("StagefrightPlayer"); 33a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 34a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon mPlayer->setListener(this); 35a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon} 36a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 37a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan DixonStagefrightPlayer::~StagefrightPlayer() { 38a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon ALOGV("~StagefrightPlayer"); 39a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon reset(); 40a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 41a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon delete mPlayer; 42a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon mPlayer = NULL; 433579d6fb5d979d2d03a6250e82c37d81d672291eBo Liu} 44a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 45a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonstatus_t StagefrightPlayer::initCheck() { 46a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon ALOGV("initCheck"); 47a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon return OK; 48a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon} 49a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 50a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonstatus_t StagefrightPlayer::setUID(uid_t uid) { 51a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon mPlayer->setUID(uid); 52a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 53a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon return OK; 54a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon} 55df44c7670d1fa36fffb614ce04bf16ba25ef65d0Bo Liu 565c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liustatus_t StagefrightPlayer::setDataSource( 575c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu const char *url, const KeyedVector<String8, String8> *headers) { 585c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu return mPlayer->setDataSource(url, headers); 595c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu} 605c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu 615c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu// Warning: The filedescriptor passed into this method will only be valid until 625c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu// the method returns, if you want to keep it, dup it! 635c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liustatus_t StagefrightPlayer::setDataSource(int fd, int64_t offset, int64_t length) { 645c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu ALOGV("setDataSource(%d, %lld, %lld)", fd, offset, length); 655c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu return mPlayer->setDataSource(dup(fd), offset, length); 665c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu} 675c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu 685c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liustatus_t StagefrightPlayer::setDataSource(const sp<IStreamSource> &source) { 695c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu return mPlayer->setDataSource(source); 705c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu} 715c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu 725c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liustatus_t StagefrightPlayer::setVideoSurfaceTexture( 735c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu const sp<IGraphicBufferProducer> &bufferProducer) { 745c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu ALOGV("setVideoSurfaceTexture"); 755c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu 765c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu return mPlayer->setSurfaceTexture(bufferProducer); 775c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu} 785c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu 795c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liustatus_t StagefrightPlayer::prepare() { 805946ee9deb44f66965e1adec70feb6ded495ae67Bo Liu return mPlayer->prepare(); 815946ee9deb44f66965e1adec70feb6ded495ae67Bo Liu} 825946ee9deb44f66965e1adec70feb6ded495ae67Bo Liu 835946ee9deb44f66965e1adec70feb6ded495ae67Bo Liustatus_t StagefrightPlayer::prepareAsync() { 845c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu return mPlayer->prepareAsync(); 855c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu} 865c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu 875c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liustatus_t StagefrightPlayer::start() { 88a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon ALOGV("start"); 89a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 90a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon return mPlayer->play(); 91a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon} 92a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 937a63db1dc253badb616ca318e59f55580ae0b054Bo Liustatus_t StagefrightPlayer::stop() { 94a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon ALOGV("stop"); 95a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 96a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon return pause(); // what's the difference? 973579d6fb5d979d2d03a6250e82c37d81d672291eBo Liu} 98a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 99a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonstatus_t StagefrightPlayer::pause() { 10064511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu ALOGV("pause"); 10164511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu 10264511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu return mPlayer->pause(); 10364511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu} 10464511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu 10564511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liubool StagefrightPlayer::isPlaying() { 10664511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu ALOGV("isPlaying"); 10764511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu return mPlayer->isPlaying(); 10864511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu} 10964511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu 11064511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liustatus_t StagefrightPlayer::seekTo(int msec) { 11164511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu ALOGV("seekTo %.2f secs", msec / 1E3); 11264511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu 11364511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu status_t err = mPlayer->seekTo((int64_t)msec * 1000); 11464511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu 11564511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu return err; 11664511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu} 11764511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu 11864511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liustatus_t StagefrightPlayer::getCurrentPosition(int *msec) { 11964511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu ALOGV("getCurrentPosition"); 12064511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu 1213579d6fb5d979d2d03a6250e82c37d81d672291eBo Liu int64_t positionUs; 12264511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu status_t err = mPlayer->getPosition(&positionUs); 1233579d6fb5d979d2d03a6250e82c37d81d672291eBo Liu 124a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon if (err != OK) { 125a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon return err; 1263579d6fb5d979d2d03a6250e82c37d81d672291eBo Liu } 127a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 128a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon *msec = (positionUs + 500) / 1000; 129a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 1303579d6fb5d979d2d03a6250e82c37d81d672291eBo Liu return OK; 131a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon} 132a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 133a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonstatus_t StagefrightPlayer::getDuration(int *msec) { 134a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon ALOGV("getDuration"); 135a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 1363579d6fb5d979d2d03a6250e82c37d81d672291eBo Liu int64_t durationUs; 137991b0c63bb8c0b0d8577a255b026117e9f37ceceJonathan Dixon status_t err = mPlayer->getDuration(&durationUs); 1383579d6fb5d979d2d03a6250e82c37d81d672291eBo Liu 139991b0c63bb8c0b0d8577a255b026117e9f37ceceJonathan Dixon if (err != OK) { 1403579d6fb5d979d2d03a6250e82c37d81d672291eBo Liu *msec = 0; 141991b0c63bb8c0b0d8577a255b026117e9f37ceceJonathan Dixon return OK; 142a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon } 143a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 144a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon *msec = (durationUs + 500) / 1000; 145a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 146a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon return OK; 147a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon} 148a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 149a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonstatus_t StagefrightPlayer::reset() { 150a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon ALOGV("reset"); 151a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 152a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon mPlayer->reset(); 153a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 154a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon return OK; 155} 156 157status_t StagefrightPlayer::setLooping(int loop) { 158 ALOGV("setLooping"); 159 160 return mPlayer->setLooping(loop); 161} 162 163player_type StagefrightPlayer::playerType() { 164 ALOGV("playerType"); 165 return STAGEFRIGHT_PLAYER; 166} 167 168status_t StagefrightPlayer::invoke(const Parcel &request, Parcel *reply) { 169 ALOGV("invoke()"); 170 return mPlayer->invoke(request, reply); 171} 172 173void StagefrightPlayer::setAudioSink(const sp<AudioSink> &audioSink) { 174 MediaPlayerInterface::setAudioSink(audioSink); 175 176 mPlayer->setAudioSink(audioSink); 177} 178 179status_t StagefrightPlayer::setParameter(int key, const Parcel &request) { 180 ALOGV("setParameter(key=%d)", key); 181 return mPlayer->setParameter(key, request); 182} 183 184status_t StagefrightPlayer::getParameter(int key, Parcel *reply) { 185 ALOGV("getParameter"); 186 return mPlayer->getParameter(key, reply); 187} 188 189status_t StagefrightPlayer::getMetadata( 190 const media::Metadata::Filter& /* ids */, Parcel *records) { 191 using media::Metadata; 192 193 uint32_t flags = mPlayer->flags(); 194 195 Metadata metadata(records); 196 197 metadata.appendBool( 198 Metadata::kPauseAvailable, 199 flags & MediaExtractor::CAN_PAUSE); 200 201 metadata.appendBool( 202 Metadata::kSeekBackwardAvailable, 203 flags & MediaExtractor::CAN_SEEK_BACKWARD); 204 205 metadata.appendBool( 206 Metadata::kSeekForwardAvailable, 207 flags & MediaExtractor::CAN_SEEK_FORWARD); 208 209 metadata.appendBool( 210 Metadata::kSeekAvailable, 211 flags & MediaExtractor::CAN_SEEK); 212 213 return OK; 214} 215 216status_t StagefrightPlayer::dump(int fd, const Vector<String16> &args) const { 217 return mPlayer->dump(fd, args); 218} 219 220} // namespace android 221