StagefrightPlayer.cpp revision a75e9fb4876139fff4bb836fb0ebd5f80c8b20b3
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
8namespace android {
9
10StagefrightPlayer::StagefrightPlayer()
11    : mPlayer(NULL) {
12    LOGV("StagefrightPlayer");
13}
14
15StagefrightPlayer::~StagefrightPlayer() {
16    LOGV("~StagefrightPlayer");
17    reset();
18    LOGV("~StagefrightPlayer done.");
19}
20
21status_t StagefrightPlayer::initCheck() {
22    LOGV("initCheck");
23    return OK;
24}
25
26status_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!
45status_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
62status_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
74status_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
88status_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
102status_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
114status_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
126status_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
138bool StagefrightPlayer::isPlaying() {
139    LOGV("isPlaying");
140    return mPlayer != NULL && mPlayer->isPlaying();
141}
142
143status_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
157status_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
168status_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
179status_t StagefrightPlayer::reset() {
180    LOGV("reset");
181
182    delete mPlayer;
183    mPlayer = NULL;
184
185    return OK;
186}
187
188status_t StagefrightPlayer::setLooping(int loop) {
189    LOGV("setLooping");
190    return UNKNOWN_ERROR;
191}
192
193player_type StagefrightPlayer::playerType() {
194    LOGV("playerType");
195    return STAGEFRIGHT_PLAYER;
196}
197
198status_t StagefrightPlayer::invoke(const Parcel &request, Parcel *reply) {
199    return INVALID_OPERATION;
200}
201
202void 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