StagefrightPlayer.cpp revision 5561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20
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
9namespace android {
10
11StagefrightPlayer::StagefrightPlayer()
12    : mPlayer(new AwesomePlayer) {
13    LOGV("StagefrightPlayer");
14
15    mPlayer->setListener(this);
16}
17
18StagefrightPlayer::~StagefrightPlayer() {
19    LOGV("~StagefrightPlayer");
20    reset();
21
22    delete mPlayer;
23    mPlayer = NULL;
24}
25
26status_t StagefrightPlayer::initCheck() {
27    LOGV("initCheck");
28    return OK;
29}
30
31status_t StagefrightPlayer::setDataSource(
32        const char *url, const KeyedVector<String8, String8> *headers) {
33    LOGI("setDataSource('%s')", url);
34    return mPlayer->setDataSource(url, headers);
35}
36
37// Warning: The filedescriptor passed into this method will only be valid until
38// the method returns, if you want to keep it, dup it!
39status_t StagefrightPlayer::setDataSource(int fd, int64_t offset, int64_t length) {
40    LOGV("setDataSource(%d, %lld, %lld)", fd, offset, length);
41    return mPlayer->setDataSource(dup(fd), offset, length);
42}
43
44status_t StagefrightPlayer::setVideoSurface(const sp<ISurface> &surface) {
45    LOGV("setVideoSurface");
46
47    mPlayer->setISurface(surface);
48    return OK;
49}
50
51status_t StagefrightPlayer::prepare() {
52    LOGV("prepare");
53
54    int32_t width, height;
55    if (mPlayer->getVideoDimensions(&width, &height) != OK) {
56        width = height = 0;
57    }
58
59    sendEvent(MEDIA_SET_VIDEO_SIZE, width, height);
60
61    return OK;
62}
63
64status_t StagefrightPlayer::prepareAsync() {
65    LOGV("prepareAsync");
66
67    status_t err = prepare();
68
69    if (err != OK) {
70        return err;
71    }
72
73    sendEvent(MEDIA_PREPARED);
74
75    return OK;
76}
77
78status_t StagefrightPlayer::start() {
79    LOGV("start");
80
81    return mPlayer->play();
82}
83
84status_t StagefrightPlayer::stop() {
85    LOGV("stop");
86
87    return pause();  // what's the difference?
88}
89
90status_t StagefrightPlayer::pause() {
91    LOGV("pause");
92
93    return mPlayer->pause();
94}
95
96bool StagefrightPlayer::isPlaying() {
97    LOGV("isPlaying");
98    return mPlayer->isPlaying();
99}
100
101status_t StagefrightPlayer::seekTo(int msec) {
102    LOGV("seekTo");
103
104    status_t err = mPlayer->seekTo((int64_t)msec * 1000);
105
106    return err;
107}
108
109status_t StagefrightPlayer::getCurrentPosition(int *msec) {
110    LOGV("getCurrentPosition");
111
112    int64_t positionUs;
113    status_t err = mPlayer->getPosition(&positionUs);
114
115    if (err != OK) {
116        return err;
117    }
118
119    *msec = (positionUs + 500) / 1000;
120
121    return OK;
122}
123
124status_t StagefrightPlayer::getDuration(int *msec) {
125    LOGV("getDuration");
126
127    int64_t durationUs;
128    status_t err = mPlayer->getDuration(&durationUs);
129
130    if (err != OK) {
131        return err;
132    }
133
134    *msec = (durationUs + 500) / 1000;
135
136    return OK;
137}
138
139status_t StagefrightPlayer::reset() {
140    LOGV("reset");
141
142    mPlayer->reset();
143
144    return OK;
145}
146
147status_t StagefrightPlayer::setLooping(int loop) {
148    LOGV("setLooping");
149
150    return mPlayer->setLooping(loop);
151}
152
153player_type StagefrightPlayer::playerType() {
154    LOGV("playerType");
155    return STAGEFRIGHT_PLAYER;
156}
157
158status_t StagefrightPlayer::invoke(const Parcel &request, Parcel *reply) {
159    return INVALID_OPERATION;
160}
161
162void StagefrightPlayer::setAudioSink(const sp<AudioSink> &audioSink) {
163    MediaPlayerInterface::setAudioSink(audioSink);
164
165    mPlayer->setAudioSink(audioSink);
166}
167
168}  // namespace android
169