StagefrightPlayer.cpp revision 7314fa17093d514199fedcb55ac41136a1b31cb3
1//#define LOG_NDEBUG 0 2#define LOG_TAG "StagefrightPlayer" 3#include <utils/Log.h> 4 5#include "StagefrightPlayer.h" 6 7#include "AwesomePlayer.h" 8 9#include <media/Metadata.h> 10#include <media/stagefright/MediaExtractor.h> 11 12namespace android { 13 14StagefrightPlayer::StagefrightPlayer() 15 : mPlayer(new AwesomePlayer) { 16 LOGV("StagefrightPlayer"); 17 18 mPlayer->setListener(this); 19} 20 21StagefrightPlayer::~StagefrightPlayer() { 22 LOGV("~StagefrightPlayer"); 23 reset(); 24 25 delete mPlayer; 26 mPlayer = NULL; 27} 28 29status_t StagefrightPlayer::initCheck() { 30 LOGV("initCheck"); 31 return OK; 32} 33 34status_t StagefrightPlayer::setDataSource( 35 const char *url, const KeyedVector<String8, String8> *headers) { 36 return mPlayer->setDataSource(url, headers); 37} 38 39// Warning: The filedescriptor passed into this method will only be valid until 40// the method returns, if you want to keep it, dup it! 41status_t StagefrightPlayer::setDataSource(int fd, int64_t offset, int64_t length) { 42 LOGV("setDataSource(%d, %lld, %lld)", fd, offset, length); 43 return mPlayer->setDataSource(dup(fd), offset, length); 44} 45 46status_t StagefrightPlayer::setDataSource(const sp<IStreamSource> &source) { 47 return mPlayer->setDataSource(source); 48} 49 50status_t StagefrightPlayer::setVideoSurface(const sp<Surface> &surface) { 51 LOGV("setVideoSurface"); 52 53 mPlayer->setSurface(surface); 54 return OK; 55} 56 57status_t StagefrightPlayer::prepare() { 58 return mPlayer->prepare(); 59} 60 61status_t StagefrightPlayer::prepareAsync() { 62 return mPlayer->prepareAsync(); 63} 64 65status_t StagefrightPlayer::start() { 66 LOGV("start"); 67 68 return mPlayer->play(); 69} 70 71status_t StagefrightPlayer::stop() { 72 LOGV("stop"); 73 74 return pause(); // what's the difference? 75} 76 77status_t StagefrightPlayer::pause() { 78 LOGV("pause"); 79 80 return mPlayer->pause(); 81} 82 83bool StagefrightPlayer::isPlaying() { 84 LOGV("isPlaying"); 85 return mPlayer->isPlaying(); 86} 87 88status_t StagefrightPlayer::seekTo(int msec) { 89 LOGV("seekTo"); 90 91 status_t err = mPlayer->seekTo((int64_t)msec * 1000); 92 93 return err; 94} 95 96status_t StagefrightPlayer::getCurrentPosition(int *msec) { 97 LOGV("getCurrentPosition"); 98 99 int64_t positionUs; 100 status_t err = mPlayer->getPosition(&positionUs); 101 102 if (err != OK) { 103 return err; 104 } 105 106 *msec = (positionUs + 500) / 1000; 107 108 return OK; 109} 110 111status_t StagefrightPlayer::getDuration(int *msec) { 112 LOGV("getDuration"); 113 114 int64_t durationUs; 115 status_t err = mPlayer->getDuration(&durationUs); 116 117 if (err != OK) { 118 *msec = 0; 119 return OK; 120 } 121 122 *msec = (durationUs + 500) / 1000; 123 124 return OK; 125} 126 127status_t StagefrightPlayer::reset() { 128 LOGV("reset"); 129 130 mPlayer->reset(); 131 132 return OK; 133} 134 135status_t StagefrightPlayer::setLooping(int loop) { 136 LOGV("setLooping"); 137 138 return mPlayer->setLooping(loop); 139} 140 141player_type StagefrightPlayer::playerType() { 142 LOGV("playerType"); 143 return STAGEFRIGHT_PLAYER; 144} 145 146status_t StagefrightPlayer::invoke(const Parcel &request, Parcel *reply) { 147 return INVALID_OPERATION; 148} 149 150void StagefrightPlayer::setAudioSink(const sp<AudioSink> &audioSink) { 151 MediaPlayerInterface::setAudioSink(audioSink); 152 153 mPlayer->setAudioSink(audioSink); 154} 155 156status_t StagefrightPlayer::getMetadata( 157 const media::Metadata::Filter& ids, Parcel *records) { 158 using media::Metadata; 159 160 uint32_t flags = mPlayer->flags(); 161 162 Metadata metadata(records); 163 164 metadata.appendBool( 165 Metadata::kPauseAvailable, 166 flags & MediaExtractor::CAN_PAUSE); 167 168 metadata.appendBool( 169 Metadata::kSeekBackwardAvailable, 170 flags & MediaExtractor::CAN_SEEK_BACKWARD); 171 172 metadata.appendBool( 173 Metadata::kSeekForwardAvailable, 174 flags & MediaExtractor::CAN_SEEK_FORWARD); 175 176 metadata.appendBool( 177 Metadata::kSeekAvailable, 178 flags & MediaExtractor::CAN_SEEK); 179 180 return OK; 181} 182 183} // namespace android 184