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 28 namespace android { 29 30 StagefrightPlayer::StagefrightPlayer() 31 : mPlayer(new AwesomePlayer) { 32 ALOGV("StagefrightPlayer"); 33 34 mPlayer->setListener(this); 35 } 36 37 StagefrightPlayer::~StagefrightPlayer() { 38 ALOGV("~StagefrightPlayer"); 39 reset(); 40 41 delete mPlayer; 42 mPlayer = NULL; 43 } 44 45 status_t StagefrightPlayer::initCheck() { 46 ALOGV("initCheck"); 47 return OK; 48 } 49 50 status_t StagefrightPlayer::setUID(uid_t uid) { 51 mPlayer->setUID(uid); 52 53 return OK; 54 } 55 56 status_t StagefrightPlayer::setDataSource( 57 const sp<IMediaHTTPService> &httpService, 58 const char *url, 59 const KeyedVector<String8, String8> *headers) { 60 return mPlayer->setDataSource(httpService, url, headers); 61 } 62 63 // Warning: The filedescriptor passed into this method will only be valid until 64 // the method returns, if you want to keep it, dup it! 65 status_t StagefrightPlayer::setDataSource(int fd, int64_t offset, int64_t length) { 66 ALOGV("setDataSource(%d, %lld, %lld)", fd, offset, length); 67 return mPlayer->setDataSource(dup(fd), offset, length); 68 } 69 70 status_t StagefrightPlayer::setDataSource(const sp<IStreamSource> &source) { 71 return mPlayer->setDataSource(source); 72 } 73 74 status_t StagefrightPlayer::setVideoSurfaceTexture( 75 const sp<IGraphicBufferProducer> &bufferProducer) { 76 ALOGV("setVideoSurfaceTexture"); 77 78 return mPlayer->setSurfaceTexture(bufferProducer); 79 } 80 81 status_t StagefrightPlayer::prepare() { 82 return mPlayer->prepare(); 83 } 84 85 status_t StagefrightPlayer::prepareAsync() { 86 return mPlayer->prepareAsync(); 87 } 88 89 status_t StagefrightPlayer::start() { 90 ALOGV("start"); 91 92 return mPlayer->play(); 93 } 94 95 status_t StagefrightPlayer::stop() { 96 ALOGV("stop"); 97 98 return pause(); // what's the difference? 99 } 100 101 status_t StagefrightPlayer::pause() { 102 ALOGV("pause"); 103 104 return mPlayer->pause(); 105 } 106 107 bool StagefrightPlayer::isPlaying() { 108 ALOGV("isPlaying"); 109 return mPlayer->isPlaying(); 110 } 111 112 status_t StagefrightPlayer::seekTo(int msec) { 113 ALOGV("seekTo %.2f secs", msec / 1E3); 114 115 status_t err = mPlayer->seekTo((int64_t)msec * 1000); 116 117 return err; 118 } 119 120 status_t StagefrightPlayer::getCurrentPosition(int *msec) { 121 ALOGV("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 135 status_t StagefrightPlayer::getDuration(int *msec) { 136 ALOGV("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 151 status_t StagefrightPlayer::reset() { 152 ALOGV("reset"); 153 154 mPlayer->reset(); 155 156 return OK; 157 } 158 159 status_t StagefrightPlayer::setLooping(int loop) { 160 ALOGV("setLooping"); 161 162 return mPlayer->setLooping(loop); 163 } 164 165 player_type StagefrightPlayer::playerType() { 166 ALOGV("playerType"); 167 return STAGEFRIGHT_PLAYER; 168 } 169 170 status_t StagefrightPlayer::invoke(const Parcel &request, Parcel *reply) { 171 ALOGV("invoke()"); 172 return mPlayer->invoke(request, reply); 173 } 174 175 void StagefrightPlayer::setAudioSink(const sp<AudioSink> &audioSink) { 176 MediaPlayerInterface::setAudioSink(audioSink); 177 178 mPlayer->setAudioSink(audioSink); 179 } 180 181 status_t StagefrightPlayer::setParameter(int key, const Parcel &request) { 182 ALOGV("setParameter(key=%d)", key); 183 return mPlayer->setParameter(key, request); 184 } 185 186 status_t StagefrightPlayer::getParameter(int key, Parcel *reply) { 187 ALOGV("getParameter"); 188 return mPlayer->getParameter(key, reply); 189 } 190 191 status_t StagefrightPlayer::setPlaybackSettings(const AudioPlaybackRate &rate) { 192 return mPlayer->setPlaybackSettings(rate); 193 } 194 195 status_t StagefrightPlayer::getPlaybackSettings(AudioPlaybackRate *rate /* nonnull */) { 196 return mPlayer->getPlaybackSettings(rate); 197 } 198 199 status_t StagefrightPlayer::getMetadata( 200 const media::Metadata::Filter& /* ids */, Parcel *records) { 201 using media::Metadata; 202 203 uint32_t flags = mPlayer->flags(); 204 205 Metadata metadata(records); 206 207 metadata.appendBool( 208 Metadata::kPauseAvailable, 209 flags & MediaExtractor::CAN_PAUSE); 210 211 metadata.appendBool( 212 Metadata::kSeekBackwardAvailable, 213 flags & MediaExtractor::CAN_SEEK_BACKWARD); 214 215 metadata.appendBool( 216 Metadata::kSeekForwardAvailable, 217 flags & MediaExtractor::CAN_SEEK_FORWARD); 218 219 metadata.appendBool( 220 Metadata::kSeekAvailable, 221 flags & MediaExtractor::CAN_SEEK); 222 223 return OK; 224 } 225 226 status_t StagefrightPlayer::dump(int fd, const Vector<String16> &args) const { 227 return mPlayer->dump(fd, args); 228 } 229 230 } // namespace android 231