StagefrightPlayer.cpp revision 4f9e47f2c03ce36261c4717cd7e131d7940bb068
1/* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17//#define LOG_NDEBUG 0 18#define LOG_TAG "StagefrightPlayer" 19#include <utils/Log.h> 20 21#include "StagefrightPlayer.h" 22 23#include "AwesomePlayer.h" 24 25#include <media/Metadata.h> 26#include <media/stagefright/MediaExtractor.h> 27 28namespace android { 29 30StagefrightPlayer::StagefrightPlayer() 31 : mPlayer(new AwesomePlayer) { 32 LOGV("StagefrightPlayer"); 33 34 mPlayer->setListener(this); 35} 36 37StagefrightPlayer::~StagefrightPlayer() { 38 LOGV("~StagefrightPlayer"); 39 reset(); 40 41 delete mPlayer; 42 mPlayer = NULL; 43} 44 45status_t StagefrightPlayer::initCheck() { 46 LOGV("initCheck"); 47 return OK; 48} 49 50status_t StagefrightPlayer::setDataSource( 51 const char *url, const KeyedVector<String8, String8> *headers) { 52 return mPlayer->setDataSource(url, headers); 53} 54 55// Warning: The filedescriptor passed into this method will only be valid until 56// the method returns, if you want to keep it, dup it! 57status_t StagefrightPlayer::setDataSource(int fd, int64_t offset, int64_t length) { 58 LOGV("setDataSource(%d, %lld, %lld)", fd, offset, length); 59 return mPlayer->setDataSource(dup(fd), offset, length); 60} 61 62status_t StagefrightPlayer::setDataSource(const sp<IStreamSource> &source) { 63 return mPlayer->setDataSource(source); 64} 65 66status_t StagefrightPlayer::setVideoSurface(const sp<Surface> &surface) { 67 LOGV("setVideoSurface"); 68 69 mPlayer->setSurface(surface); 70 return OK; 71} 72 73status_t StagefrightPlayer::setVideoSurfaceTexture( 74 const sp<ISurfaceTexture> &surfaceTexture) { 75 LOGV("setVideoSurfaceTexture"); 76 77 mPlayer->setSurfaceTexture(surfaceTexture); 78 return OK; 79} 80 81status_t StagefrightPlayer::prepare() { 82 return mPlayer->prepare(); 83} 84 85status_t StagefrightPlayer::prepareAsync() { 86 return mPlayer->prepareAsync(); 87} 88 89status_t StagefrightPlayer::start() { 90 LOGV("start"); 91 92 return mPlayer->play(); 93} 94 95status_t StagefrightPlayer::stop() { 96 LOGV("stop"); 97 98 return pause(); // what's the difference? 99} 100 101status_t StagefrightPlayer::pause() { 102 LOGV("pause"); 103 104 return mPlayer->pause(); 105} 106 107bool StagefrightPlayer::isPlaying() { 108 LOGV("isPlaying"); 109 return mPlayer->isPlaying(); 110} 111 112status_t StagefrightPlayer::seekTo(int msec) { 113 LOGV("seekTo %.2f secs", msec / 1E3); 114 115 status_t err = mPlayer->seekTo((int64_t)msec * 1000); 116 117 return err; 118} 119 120status_t StagefrightPlayer::getCurrentPosition(int *msec) { 121 LOGV("getCurrentPosition"); 122 123 int64_t positionUs; 124 status_t err = mPlayer->getPosition(&positionUs); 125 126 if (err != OK) { 127 return err; 128 } 129 130 *msec = (positionUs + 500) / 1000; 131 132 return OK; 133} 134 135status_t StagefrightPlayer::getDuration(int *msec) { 136 LOGV("getDuration"); 137 138 int64_t durationUs; 139 status_t err = mPlayer->getDuration(&durationUs); 140 141 if (err != OK) { 142 *msec = 0; 143 return OK; 144 } 145 146 *msec = (durationUs + 500) / 1000; 147 148 return OK; 149} 150 151status_t StagefrightPlayer::reset() { 152 LOGV("reset"); 153 154 mPlayer->reset(); 155 156 return OK; 157} 158 159status_t StagefrightPlayer::setLooping(int loop) { 160 LOGV("setLooping"); 161 162 return mPlayer->setLooping(loop); 163} 164 165player_type StagefrightPlayer::playerType() { 166 LOGV("playerType"); 167 return STAGEFRIGHT_PLAYER; 168} 169 170status_t StagefrightPlayer::invoke(const Parcel &request, Parcel *reply) { 171 return INVALID_OPERATION; 172} 173 174void StagefrightPlayer::setAudioSink(const sp<AudioSink> &audioSink) { 175 MediaPlayerInterface::setAudioSink(audioSink); 176 177 mPlayer->setAudioSink(audioSink); 178} 179 180status_t StagefrightPlayer::setParameter(int key, const Parcel &request) { 181 LOGV("setParameter"); 182 return mPlayer->setParameter(key, request); 183} 184 185status_t StagefrightPlayer::getParameter(int key, Parcel *reply) { 186 LOGV("getParameter"); 187 return mPlayer->getParameter(key, reply); 188} 189 190status_t StagefrightPlayer::getMetadata( 191 const media::Metadata::Filter& ids, Parcel *records) { 192 using media::Metadata; 193 194 uint32_t flags = mPlayer->flags(); 195 196 Metadata metadata(records); 197 198 metadata.appendBool( 199 Metadata::kPauseAvailable, 200 flags & MediaExtractor::CAN_PAUSE); 201 202 metadata.appendBool( 203 Metadata::kSeekBackwardAvailable, 204 flags & MediaExtractor::CAN_SEEK_BACKWARD); 205 206 metadata.appendBool( 207 Metadata::kSeekForwardAvailable, 208 flags & MediaExtractor::CAN_SEEK_FORWARD); 209 210 metadata.appendBool( 211 Metadata::kSeekAvailable, 212 flags & MediaExtractor::CAN_SEEK); 213 214 return OK; 215} 216 217} // namespace android 218