127c174483a8ae9688d5d4897c19074f62c7f1701James Dong/*
227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Copyright (C) 2009 The Android Open Source Project
327c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Licensed under the Apache License, Version 2.0 (the "License");
527c174483a8ae9688d5d4897c19074f62c7f1701James Dong * you may not use this file except in compliance with the License.
627c174483a8ae9688d5d4897c19074f62c7f1701James Dong * You may obtain a copy of the License at
727c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
827c174483a8ae9688d5d4897c19074f62c7f1701James Dong *      http://www.apache.org/licenses/LICENSE-2.0
927c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
1027c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Unless required by applicable law or agreed to in writing, software
1127c174483a8ae9688d5d4897c19074f62c7f1701James Dong * distributed under the License is distributed on an "AS IS" BASIS,
1227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * See the License for the specific language governing permissions and
1427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * limitations under the License.
1527c174483a8ae9688d5d4897c19074f62c7f1701James Dong */
1627c174483a8ae9688d5d4897c19074f62c7f1701James Dong
1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//#define LOG_NDEBUG 0
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define LOG_TAG "StagefrightPlayer"
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Log.h>
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include "StagefrightPlayer.h"
22bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
23bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include "AwesomePlayer.h"
2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber#include <media/Metadata.h>
26acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber#include <media/stagefright/MediaExtractor.h>
27acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3020111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberStagefrightPlayer::StagefrightPlayer()
31bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    : mPlayer(new AwesomePlayer) {
323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("StagefrightPlayer");
33bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
34bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mPlayer->setListener(this);
3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3720111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberStagefrightPlayer::~StagefrightPlayer() {
383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("~StagefrightPlayer");
3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    reset();
40bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
41bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    delete mPlayer;
42bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mPlayer = NULL;
4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::initCheck() {
463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("initCheck");
4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
509b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huberstatus_t StagefrightPlayer::setUID(uid_t uid) {
519b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mPlayer->setUID(uid);
529b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
539b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    return OK;
549b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber}
559b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
562db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huberstatus_t StagefrightPlayer::setDataSource(
571b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const sp<IMediaHTTPService> &httpService,
581b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const char *url,
591b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const KeyedVector<String8, String8> *headers) {
601b86fe063badb5f28c467ade39be0f4008688947Andreas Huber    return mPlayer->setDataSource(httpService, url, headers);
6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
63a75e9fb4876139fff4bb836fb0ebd5f80c8b20b3Andreas Huber// Warning: The filedescriptor passed into this method will only be valid until
64a75e9fb4876139fff4bb836fb0ebd5f80c8b20b3Andreas Huber// the method returns, if you want to keep it, dup it!
6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::setDataSource(int fd, int64_t offset, int64_t length) {
663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setDataSource(%d, %lld, %lld)", fd, offset, length);
67bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mPlayer->setDataSource(dup(fd), offset, length);
6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
70e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t StagefrightPlayer::setDataSource(const sp<IStreamSource> &source) {
71e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    return mPlayer->setDataSource(source);
72e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
73e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
741173118eace0e9e347cb007f0da817cee87579edGlenn Kastenstatus_t StagefrightPlayer::setVideoSurfaceTexture(
758ba01021b573889802e67e029225a96f0dfa471aAndy McFadden        const sp<IGraphicBufferProducer> &bufferProducer) {
763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoSurfaceTexture");
771173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
788ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    return mPlayer->setSurfaceTexture(bufferProducer);
791173118eace0e9e347cb007f0da817cee87579edGlenn Kasten}
801173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::prepare() {
82c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    return mPlayer->prepare();
8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::prepareAsync() {
86c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    return mPlayer->prepareAsync();
8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::start() {
903856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("start");
9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
92bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mPlayer->play();
9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::stop() {
963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stop");
9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
98bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return pause();  // what's the difference?
9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::pause() {
1023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("pause");
10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
104bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mPlayer->pause();
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool StagefrightPlayer::isPlaying() {
1083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("isPlaying");
109bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mPlayer->isPlaying();
11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::seekTo(int msec) {
1133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("seekTo %.2f secs", msec / 1E3);
11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    status_t err = mPlayer->seekTo((int64_t)msec * 1000);
11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return err;
11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::getCurrentPosition(int *msec) {
1213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getCurrentPosition");
12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
123bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t positionUs;
124bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    status_t err = mPlayer->getPosition(&positionUs);
125bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
126bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (err != OK) {
127bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return err;
12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
130bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    *msec = (positionUs + 500) / 1000;
131bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::getDuration(int *msec) {
1363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getDuration");
13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
138bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t durationUs;
139bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    status_t err = mPlayer->getDuration(&durationUs);
140bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
141bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (err != OK) {
142acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber        *msec = 0;
143acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber        return OK;
14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
146bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    *msec = (durationUs + 500) / 1000;
147bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::reset() {
1523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("reset");
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
154bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mPlayer->reset();
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::setLooping(int loop) {
1603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setLooping");
161bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
162bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mPlayer->setLooping(loop);
16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberplayer_type StagefrightPlayer::playerType() {
1663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("playerType");
16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return STAGEFRIGHT_PLAYER;
16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::invoke(const Parcel &request, Parcel *reply) {
171f9d660a5e0196240add5daf0199f128d471e592cInsun Kang    ALOGV("invoke()");
172f9d660a5e0196240add5daf0199f128d471e592cInsun Kang    return mPlayer->invoke(request, reply);
17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
17420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17520111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid StagefrightPlayer::setAudioSink(const sp<AudioSink> &audioSink) {
17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaPlayerInterface::setAudioSink(audioSink);
17720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
178bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mPlayer->setAudioSink(audioSink);
17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1814f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t StagefrightPlayer::setParameter(int key, const Parcel &request) {
1827a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi    ALOGV("setParameter(key=%d)", key);
1834f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    return mPlayer->setParameter(key, request);
1844f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang}
1854f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
1864f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t StagefrightPlayer::getParameter(int key, Parcel *reply) {
1873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getParameter");
1884f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    return mPlayer->getParameter(key, reply);
1894f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang}
1904f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
191acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huberstatus_t StagefrightPlayer::getMetadata(
19284333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        const media::Metadata::Filter& /* ids */, Parcel *records) {
193acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    using media::Metadata;
194acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
195acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    uint32_t flags = mPlayer->flags();
196acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
197acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    Metadata metadata(records);
198acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
199acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    metadata.appendBool(
200acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber            Metadata::kPauseAvailable,
201acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber            flags & MediaExtractor::CAN_PAUSE);
202acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
203acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    metadata.appendBool(
204acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber            Metadata::kSeekBackwardAvailable,
205acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber            flags & MediaExtractor::CAN_SEEK_BACKWARD);
206acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
207acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    metadata.appendBool(
208acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber            Metadata::kSeekForwardAvailable,
209acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber            flags & MediaExtractor::CAN_SEEK_FORWARD);
210acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
21170f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber    metadata.appendBool(
21270f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber            Metadata::kSeekAvailable,
21370f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber            flags & MediaExtractor::CAN_SEEK);
21470f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber
215acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    return OK;
216acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber}
217acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
218a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huberstatus_t StagefrightPlayer::dump(int fd, const Vector<String16> &args) const {
219a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    return mPlayer->dump(fd, args);
220a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber}
221a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
223