StagefrightPlayer.cpp revision 05ea6434ed399395e2dbe9f68abb44f04b274cb0
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    LOGI("setDataSource('%s')", url);
37    return mPlayer->setDataSource(url, headers);
38}
39
40// Warning: The filedescriptor passed into this method will only be valid until
41// the method returns, if you want to keep it, dup it!
42status_t StagefrightPlayer::setDataSource(int fd, int64_t offset, int64_t length) {
43    LOGV("setDataSource(%d, %lld, %lld)", fd, offset, length);
44    return mPlayer->setDataSource(dup(fd), offset, length);
45}
46
47status_t StagefrightPlayer::setVideoISurface(const sp<ISurface> &surface) {
48    LOGV("setVideoISurface");
49
50    mPlayer->setISurface(surface);
51    return OK;
52}
53
54status_t StagefrightPlayer::setVideoSurface(const sp<Surface> &surface) {
55    LOGV("setVideoSurface");
56
57    mPlayer->setSurface(surface);
58    return OK;
59}
60
61status_t StagefrightPlayer::prepare() {
62    return mPlayer->prepare();
63}
64
65status_t StagefrightPlayer::prepareAsync() {
66    return mPlayer->prepareAsync();
67}
68
69status_t StagefrightPlayer::start() {
70    LOGV("start");
71
72    return mPlayer->play();
73}
74
75status_t StagefrightPlayer::stop() {
76    LOGV("stop");
77
78    return pause();  // what's the difference?
79}
80
81status_t StagefrightPlayer::pause() {
82    LOGV("pause");
83
84    return mPlayer->pause();
85}
86
87bool StagefrightPlayer::isPlaying() {
88    LOGV("isPlaying");
89    return mPlayer->isPlaying();
90}
91
92status_t StagefrightPlayer::seekTo(int msec) {
93    LOGV("seekTo");
94
95    status_t err = mPlayer->seekTo((int64_t)msec * 1000);
96
97    return err;
98}
99
100status_t StagefrightPlayer::getCurrentPosition(int *msec) {
101    LOGV("getCurrentPosition");
102
103    int64_t positionUs;
104    status_t err = mPlayer->getPosition(&positionUs);
105
106    if (err != OK) {
107        return err;
108    }
109
110    *msec = (positionUs + 500) / 1000;
111
112    return OK;
113}
114
115status_t StagefrightPlayer::getDuration(int *msec) {
116    LOGV("getDuration");
117
118    int64_t durationUs;
119    status_t err = mPlayer->getDuration(&durationUs);
120
121    if (err != OK) {
122        *msec = 0;
123        return OK;
124    }
125
126    *msec = (durationUs + 500) / 1000;
127
128    return OK;
129}
130
131status_t StagefrightPlayer::reset() {
132    LOGV("reset");
133
134    mPlayer->reset();
135
136    return OK;
137}
138
139status_t StagefrightPlayer::setLooping(int loop) {
140    LOGV("setLooping");
141
142    return mPlayer->setLooping(loop);
143}
144
145player_type StagefrightPlayer::playerType() {
146    LOGV("playerType");
147    return STAGEFRIGHT_PLAYER;
148}
149
150status_t StagefrightPlayer::invoke(const Parcel &request, Parcel *reply) {
151    return INVALID_OPERATION;
152}
153
154void StagefrightPlayer::setAudioSink(const sp<AudioSink> &audioSink) {
155    MediaPlayerInterface::setAudioSink(audioSink);
156
157    mPlayer->setAudioSink(audioSink);
158}
159
160status_t StagefrightPlayer::getMetadata(
161        const media::Metadata::Filter& ids, Parcel *records) {
162    using media::Metadata;
163
164    uint32_t flags = mPlayer->flags();
165
166    Metadata metadata(records);
167
168    metadata.appendBool(
169            Metadata::kPauseAvailable,
170            flags & MediaExtractor::CAN_PAUSE);
171
172    metadata.appendBool(
173            Metadata::kSeekBackwardAvailable,
174            flags & MediaExtractor::CAN_SEEK_BACKWARD);
175
176    metadata.appendBool(
177            Metadata::kSeekForwardAvailable,
178            flags & MediaExtractor::CAN_SEEK_FORWARD);
179
180    metadata.appendBool(
181            Metadata::kSeekAvailable,
182            flags & MediaExtractor::CAN_SEEK);
183
184    return OK;
185}
186
187}  // namespace android
188