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