1 //#define LOG_NDEBUG 0
2 #define LOG_TAG "StagefrightPlayer"
3 #include <utils/Log.h>
4
5 #include "StagefrightPlayer.h"
6 #include <media/stagefright/MediaPlayerImpl.h>
7
8 namespace android {
9
StagefrightPlayer()10 StagefrightPlayer::StagefrightPlayer()
11 : mPlayer(NULL) {
12 LOGV("StagefrightPlayer");
13 }
14
~StagefrightPlayer()15 StagefrightPlayer::~StagefrightPlayer() {
16 LOGV("~StagefrightPlayer");
17 reset();
18 LOGV("~StagefrightPlayer done.");
19 }
20
initCheck()21 status_t StagefrightPlayer::initCheck() {
22 LOGV("initCheck");
23 return OK;
24 }
25
setDataSource(const char * url)26 status_t StagefrightPlayer::setDataSource(const char *url) {
27 LOGV("setDataSource('%s')", url);
28
29 reset();
30 mPlayer = new MediaPlayerImpl(url);
31
32 status_t err = mPlayer->initCheck();
33 if (err != OK) {
34 delete mPlayer;
35 mPlayer = NULL;
36 } else {
37 mPlayer->setAudioSink(mAudioSink);
38 }
39
40 return err;
41 }
42
43 // Warning: The filedescriptor passed into this method will only be valid until
44 // the method returns, if you want to keep it, dup it!
setDataSource(int fd,int64_t offset,int64_t length)45 status_t StagefrightPlayer::setDataSource(int fd, int64_t offset, int64_t length) {
46 LOGV("setDataSource(%d, %lld, %lld)", fd, offset, length);
47
48 reset();
49 mPlayer = new MediaPlayerImpl(dup(fd), offset, length);
50
51 status_t err = mPlayer->initCheck();
52 if (err != OK) {
53 delete mPlayer;
54 mPlayer = NULL;
55 } else {
56 mPlayer->setAudioSink(mAudioSink);
57 }
58
59 return err;
60 }
61
setVideoSurface(const sp<ISurface> & surface)62 status_t StagefrightPlayer::setVideoSurface(const sp<ISurface> &surface) {
63 LOGV("setVideoSurface");
64
65 if (mPlayer == NULL) {
66 return NO_INIT;
67 }
68
69 mPlayer->setISurface(surface);
70
71 return OK;
72 }
73
prepare()74 status_t StagefrightPlayer::prepare() {
75 LOGV("prepare");
76
77 if (mPlayer == NULL) {
78 return NO_INIT;
79 }
80
81 sendEvent(
82 MEDIA_SET_VIDEO_SIZE,
83 mPlayer->getWidth(), mPlayer->getHeight());
84
85 return OK;
86 }
87
prepareAsync()88 status_t StagefrightPlayer::prepareAsync() {
89 LOGV("prepareAsync");
90
91 status_t err = prepare();
92
93 if (err != OK) {
94 return err;
95 }
96
97 sendEvent(MEDIA_PREPARED);
98
99 return OK;
100 }
101
start()102 status_t StagefrightPlayer::start() {
103 LOGV("start");
104
105 if (mPlayer == NULL) {
106 return NO_INIT;
107 }
108
109 mPlayer->play();
110
111 return OK;
112 }
113
stop()114 status_t StagefrightPlayer::stop() {
115 LOGV("stop");
116
117 if (mPlayer == NULL) {
118 return NO_INIT;
119 }
120
121 reset();
122
123 return OK;
124 }
125
pause()126 status_t StagefrightPlayer::pause() {
127 LOGV("pause");
128
129 if (mPlayer == NULL) {
130 return NO_INIT;
131 }
132
133 mPlayer->pause();
134
135 return OK;
136 }
137
isPlaying()138 bool StagefrightPlayer::isPlaying() {
139 LOGV("isPlaying");
140 return mPlayer != NULL && mPlayer->isPlaying();
141 }
142
seekTo(int msec)143 status_t StagefrightPlayer::seekTo(int msec) {
144 LOGV("seekTo");
145
146 if (mPlayer == NULL) {
147 return NO_INIT;
148 }
149
150 status_t err = mPlayer->seekTo((int64_t)msec * 1000);
151
152 sendEvent(MEDIA_SEEK_COMPLETE);
153
154 return err;
155 }
156
getCurrentPosition(int * msec)157 status_t StagefrightPlayer::getCurrentPosition(int *msec) {
158 LOGV("getCurrentPosition");
159
160 if (mPlayer == NULL) {
161 return NO_INIT;
162 }
163
164 *msec = mPlayer->getPosition() / 1000;
165 return OK;
166 }
167
getDuration(int * msec)168 status_t StagefrightPlayer::getDuration(int *msec) {
169 LOGV("getDuration");
170
171 if (mPlayer == NULL) {
172 return NO_INIT;
173 }
174
175 *msec = mPlayer->getDuration() / 1000;
176 return OK;
177 }
178
reset()179 status_t StagefrightPlayer::reset() {
180 LOGV("reset");
181
182 delete mPlayer;
183 mPlayer = NULL;
184
185 return OK;
186 }
187
setLooping(int loop)188 status_t StagefrightPlayer::setLooping(int loop) {
189 LOGV("setLooping");
190 return UNKNOWN_ERROR;
191 }
192
playerType()193 player_type StagefrightPlayer::playerType() {
194 LOGV("playerType");
195 return STAGEFRIGHT_PLAYER;
196 }
197
invoke(const Parcel & request,Parcel * reply)198 status_t StagefrightPlayer::invoke(const Parcel &request, Parcel *reply) {
199 return INVALID_OPERATION;
200 }
201
setAudioSink(const sp<AudioSink> & audioSink)202 void StagefrightPlayer::setAudioSink(const sp<AudioSink> &audioSink) {
203 MediaPlayerInterface::setAudioSink(audioSink);
204
205 if (mPlayer != NULL) {
206 mPlayer->setAudioSink(audioSink);
207 }
208 }
209
210 } // namespace android
211