StagefrightPlayer.cpp revision 4f9e47f2c03ce36261c4717cd7e131d7940bb068
1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17//#define LOG_NDEBUG 0
18#define LOG_TAG "StagefrightPlayer"
19#include <utils/Log.h>
20
21#include "StagefrightPlayer.h"
22
23#include "AwesomePlayer.h"
24
25#include <media/Metadata.h>
26#include <media/stagefright/MediaExtractor.h>
27
28namespace android {
29
30StagefrightPlayer::StagefrightPlayer()
31    : mPlayer(new AwesomePlayer) {
32    LOGV("StagefrightPlayer");
33
34    mPlayer->setListener(this);
35}
36
37StagefrightPlayer::~StagefrightPlayer() {
38    LOGV("~StagefrightPlayer");
39    reset();
40
41    delete mPlayer;
42    mPlayer = NULL;
43}
44
45status_t StagefrightPlayer::initCheck() {
46    LOGV("initCheck");
47    return OK;
48}
49
50status_t StagefrightPlayer::setDataSource(
51        const char *url, const KeyedVector<String8, String8> *headers) {
52    return mPlayer->setDataSource(url, headers);
53}
54
55// Warning: The filedescriptor passed into this method will only be valid until
56// the method returns, if you want to keep it, dup it!
57status_t StagefrightPlayer::setDataSource(int fd, int64_t offset, int64_t length) {
58    LOGV("setDataSource(%d, %lld, %lld)", fd, offset, length);
59    return mPlayer->setDataSource(dup(fd), offset, length);
60}
61
62status_t StagefrightPlayer::setDataSource(const sp<IStreamSource> &source) {
63    return mPlayer->setDataSource(source);
64}
65
66status_t StagefrightPlayer::setVideoSurface(const sp<Surface> &surface) {
67    LOGV("setVideoSurface");
68
69    mPlayer->setSurface(surface);
70    return OK;
71}
72
73status_t StagefrightPlayer::setVideoSurfaceTexture(
74        const sp<ISurfaceTexture> &surfaceTexture) {
75    LOGV("setVideoSurfaceTexture");
76
77    mPlayer->setSurfaceTexture(surfaceTexture);
78    return OK;
79}
80
81status_t StagefrightPlayer::prepare() {
82    return mPlayer->prepare();
83}
84
85status_t StagefrightPlayer::prepareAsync() {
86    return mPlayer->prepareAsync();
87}
88
89status_t StagefrightPlayer::start() {
90    LOGV("start");
91
92    return mPlayer->play();
93}
94
95status_t StagefrightPlayer::stop() {
96    LOGV("stop");
97
98    return pause();  // what's the difference?
99}
100
101status_t StagefrightPlayer::pause() {
102    LOGV("pause");
103
104    return mPlayer->pause();
105}
106
107bool StagefrightPlayer::isPlaying() {
108    LOGV("isPlaying");
109    return mPlayer->isPlaying();
110}
111
112status_t StagefrightPlayer::seekTo(int msec) {
113    LOGV("seekTo %.2f secs", msec / 1E3);
114
115    status_t err = mPlayer->seekTo((int64_t)msec * 1000);
116
117    return err;
118}
119
120status_t StagefrightPlayer::getCurrentPosition(int *msec) {
121    LOGV("getCurrentPosition");
122
123    int64_t positionUs;
124    status_t err = mPlayer->getPosition(&positionUs);
125
126    if (err != OK) {
127        return err;
128    }
129
130    *msec = (positionUs + 500) / 1000;
131
132    return OK;
133}
134
135status_t StagefrightPlayer::getDuration(int *msec) {
136    LOGV("getDuration");
137
138    int64_t durationUs;
139    status_t err = mPlayer->getDuration(&durationUs);
140
141    if (err != OK) {
142        *msec = 0;
143        return OK;
144    }
145
146    *msec = (durationUs + 500) / 1000;
147
148    return OK;
149}
150
151status_t StagefrightPlayer::reset() {
152    LOGV("reset");
153
154    mPlayer->reset();
155
156    return OK;
157}
158
159status_t StagefrightPlayer::setLooping(int loop) {
160    LOGV("setLooping");
161
162    return mPlayer->setLooping(loop);
163}
164
165player_type StagefrightPlayer::playerType() {
166    LOGV("playerType");
167    return STAGEFRIGHT_PLAYER;
168}
169
170status_t StagefrightPlayer::invoke(const Parcel &request, Parcel *reply) {
171    return INVALID_OPERATION;
172}
173
174void StagefrightPlayer::setAudioSink(const sp<AudioSink> &audioSink) {
175    MediaPlayerInterface::setAudioSink(audioSink);
176
177    mPlayer->setAudioSink(audioSink);
178}
179
180status_t StagefrightPlayer::setParameter(int key, const Parcel &request) {
181    LOGV("setParameter");
182    return mPlayer->setParameter(key, request);
183}
184
185status_t StagefrightPlayer::getParameter(int key, Parcel *reply) {
186    LOGV("getParameter");
187    return mPlayer->getParameter(key, reply);
188}
189
190status_t StagefrightPlayer::getMetadata(
191        const media::Metadata::Filter& ids, Parcel *records) {
192    using media::Metadata;
193
194    uint32_t flags = mPlayer->flags();
195
196    Metadata metadata(records);
197
198    metadata.appendBool(
199            Metadata::kPauseAvailable,
200            flags & MediaExtractor::CAN_PAUSE);
201
202    metadata.appendBool(
203            Metadata::kSeekBackwardAvailable,
204            flags & MediaExtractor::CAN_SEEK_BACKWARD);
205
206    metadata.appendBool(
207            Metadata::kSeekForwardAvailable,
208            flags & MediaExtractor::CAN_SEEK_FORWARD);
209
210    metadata.appendBool(
211            Metadata::kSeekAvailable,
212            flags & MediaExtractor::CAN_SEEK);
213
214    return OK;
215}
216
217}  // namespace android
218