StagefrightPlayer.cpp revision d411b4ca2945cd8974a3a78199fce94646950128
1a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon/*
2a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * Copyright (C) 2009 The Android Open Source Project
3a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon *
4a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * Licensed under the Apache License, Version 2.0 (the "License");
5a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * you may not use this file except in compliance with the License.
6a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * You may obtain a copy of the License at
7a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon *
8a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon *      http://www.apache.org/licenses/LICENSE-2.0
9a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon *
10a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * Unless required by applicable law or agreed to in writing, software
11a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * distributed under the License is distributed on an "AS IS" BASIS,
12a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * See the License for the specific language governing permissions and
14a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon * limitations under the License.
15a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon */
16a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
17a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon//#define LOG_NDEBUG 0
18a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon#define LOG_TAG "StagefrightPlayer"
19a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon#include <utils/Log.h>
20a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
21a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon#include "StagefrightPlayer.h"
22a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
23a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon#include "AwesomePlayer.h"
2464511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu
25a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon#include <media/Metadata.h>
26a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon#include <media/stagefright/MediaExtractor.h>
2764511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu
2864511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liunamespace android {
2964511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu
30a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan DixonStagefrightPlayer::StagefrightPlayer()
31a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    : mPlayer(new AwesomePlayer) {
32a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    ALOGV("StagefrightPlayer");
33a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
34a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    mPlayer->setListener(this);
35a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon}
36a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
37a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan DixonStagefrightPlayer::~StagefrightPlayer() {
38a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    ALOGV("~StagefrightPlayer");
39a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    reset();
40a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
41a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    delete mPlayer;
42a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    mPlayer = NULL;
433579d6fb5d979d2d03a6250e82c37d81d672291eBo Liu}
44a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
45a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonstatus_t StagefrightPlayer::initCheck() {
46a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    ALOGV("initCheck");
47a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    return OK;
48a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon}
49a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
50a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonstatus_t StagefrightPlayer::setUID(uid_t uid) {
51a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    mPlayer->setUID(uid);
52a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
53a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    return OK;
54a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon}
55df44c7670d1fa36fffb614ce04bf16ba25ef65d0Bo Liu
565c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liustatus_t StagefrightPlayer::setDataSource(
575c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu        const char *url, const KeyedVector<String8, String8> *headers) {
585c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu    return mPlayer->setDataSource(url, headers);
595c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu}
605c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu
615c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu// Warning: The filedescriptor passed into this method will only be valid until
625c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu// the method returns, if you want to keep it, dup it!
635c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liustatus_t StagefrightPlayer::setDataSource(int fd, int64_t offset, int64_t length) {
645c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu    ALOGV("setDataSource(%d, %lld, %lld)", fd, offset, length);
655c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu    return mPlayer->setDataSource(dup(fd), offset, length);
665c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu}
675c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu
685c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liustatus_t StagefrightPlayer::setDataSource(const sp<IStreamSource> &source) {
695c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu    return mPlayer->setDataSource(source);
705c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu}
715c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu
725c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liustatus_t StagefrightPlayer::setVideoSurfaceTexture(
735c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu        const sp<IGraphicBufferProducer> &bufferProducer) {
745c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu    ALOGV("setVideoSurfaceTexture");
755c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu
765c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu    return mPlayer->setSurfaceTexture(bufferProducer);
775c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu}
785c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu
795c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liustatus_t StagefrightPlayer::prepare() {
805946ee9deb44f66965e1adec70feb6ded495ae67Bo Liu    return mPlayer->prepare();
815946ee9deb44f66965e1adec70feb6ded495ae67Bo Liu}
825946ee9deb44f66965e1adec70feb6ded495ae67Bo Liu
835946ee9deb44f66965e1adec70feb6ded495ae67Bo Liustatus_t StagefrightPlayer::prepareAsync() {
845c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu    return mPlayer->prepareAsync();
855c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu}
865c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liu
875c5385f3e5f86c5183408e52f76f1bb7798cda9aBo Liustatus_t StagefrightPlayer::start() {
88a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    ALOGV("start");
89a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
90a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    return mPlayer->play();
91a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon}
92a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
937a63db1dc253badb616ca318e59f55580ae0b054Bo Liustatus_t StagefrightPlayer::stop() {
94a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    ALOGV("stop");
95a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
96a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    return pause();  // what's the difference?
973579d6fb5d979d2d03a6250e82c37d81d672291eBo Liu}
98a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
99a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonstatus_t StagefrightPlayer::pause() {
10064511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu    ALOGV("pause");
10164511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu
10264511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu    return mPlayer->pause();
10364511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu}
10464511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu
10564511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liubool StagefrightPlayer::isPlaying() {
10664511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu    ALOGV("isPlaying");
10764511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu    return mPlayer->isPlaying();
10864511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu}
10964511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu
11064511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liustatus_t StagefrightPlayer::seekTo(int msec) {
11164511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu    ALOGV("seekTo %.2f secs", msec / 1E3);
11264511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu
11364511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu    status_t err = mPlayer->seekTo((int64_t)msec * 1000);
11464511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu
11564511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu    return err;
11664511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu}
11764511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu
11864511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liustatus_t StagefrightPlayer::getCurrentPosition(int *msec) {
11964511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu    ALOGV("getCurrentPosition");
12064511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu
1213579d6fb5d979d2d03a6250e82c37d81d672291eBo Liu    int64_t positionUs;
12264511fa442b9937f0e6d8449ec0c230767f0cfa9Bo Liu    status_t err = mPlayer->getPosition(&positionUs);
1233579d6fb5d979d2d03a6250e82c37d81d672291eBo Liu
124a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    if (err != OK) {
125a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        return err;
1263579d6fb5d979d2d03a6250e82c37d81d672291eBo Liu    }
127a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
128a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    *msec = (positionUs + 500) / 1000;
129a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
1303579d6fb5d979d2d03a6250e82c37d81d672291eBo Liu    return OK;
131a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon}
132a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
133a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonstatus_t StagefrightPlayer::getDuration(int *msec) {
134a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    ALOGV("getDuration");
135a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
1363579d6fb5d979d2d03a6250e82c37d81d672291eBo Liu    int64_t durationUs;
137991b0c63bb8c0b0d8577a255b026117e9f37ceceJonathan Dixon    status_t err = mPlayer->getDuration(&durationUs);
1383579d6fb5d979d2d03a6250e82c37d81d672291eBo Liu
139991b0c63bb8c0b0d8577a255b026117e9f37ceceJonathan Dixon    if (err != OK) {
1403579d6fb5d979d2d03a6250e82c37d81d672291eBo Liu        *msec = 0;
141991b0c63bb8c0b0d8577a255b026117e9f37ceceJonathan Dixon        return OK;
142a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    }
143a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
144a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    *msec = (durationUs + 500) / 1000;
145a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
146a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    return OK;
147a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon}
148a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
149a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonstatus_t StagefrightPlayer::reset() {
150a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    ALOGV("reset");
151a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
152a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    mPlayer->reset();
153a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon
154a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    return OK;
155}
156
157status_t StagefrightPlayer::setLooping(int loop) {
158    ALOGV("setLooping");
159
160    return mPlayer->setLooping(loop);
161}
162
163player_type StagefrightPlayer::playerType() {
164    ALOGV("playerType");
165    return STAGEFRIGHT_PLAYER;
166}
167
168status_t StagefrightPlayer::invoke(const Parcel &request, Parcel *reply) {
169    ALOGV("invoke()");
170    return mPlayer->invoke(request, reply);
171}
172
173void StagefrightPlayer::setAudioSink(const sp<AudioSink> &audioSink) {
174    MediaPlayerInterface::setAudioSink(audioSink);
175
176    mPlayer->setAudioSink(audioSink);
177}
178
179status_t StagefrightPlayer::setParameter(int key, const Parcel &request) {
180    ALOGV("setParameter(key=%d)", key);
181    return mPlayer->setParameter(key, request);
182}
183
184status_t StagefrightPlayer::getParameter(int key, Parcel *reply) {
185    ALOGV("getParameter");
186    return mPlayer->getParameter(key, reply);
187}
188
189status_t StagefrightPlayer::getMetadata(
190        const media::Metadata::Filter& /* ids */, Parcel *records) {
191    using media::Metadata;
192
193    uint32_t flags = mPlayer->flags();
194
195    Metadata metadata(records);
196
197    metadata.appendBool(
198            Metadata::kPauseAvailable,
199            flags & MediaExtractor::CAN_PAUSE);
200
201    metadata.appendBool(
202            Metadata::kSeekBackwardAvailable,
203            flags & MediaExtractor::CAN_SEEK_BACKWARD);
204
205    metadata.appendBool(
206            Metadata::kSeekForwardAvailable,
207            flags & MediaExtractor::CAN_SEEK_FORWARD);
208
209    metadata.appendBool(
210            Metadata::kSeekAvailable,
211            flags & MediaExtractor::CAN_SEEK);
212
213    return OK;
214}
215
216status_t StagefrightPlayer::dump(int fd, const Vector<String16> &args) const {
217    return mPlayer->dump(fd, args);
218}
219
220}  // namespace android
221