Home | History | Annotate | Download | only in libmediaplayerservice
      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 
     28 namespace android {
     29 
     30 StagefrightPlayer::StagefrightPlayer()
     31     : mPlayer(new AwesomePlayer) {
     32     ALOGV("StagefrightPlayer");
     33 
     34     mPlayer->setListener(this);
     35 }
     36 
     37 StagefrightPlayer::~StagefrightPlayer() {
     38     ALOGV("~StagefrightPlayer");
     39     reset();
     40 
     41     delete mPlayer;
     42     mPlayer = NULL;
     43 }
     44 
     45 status_t StagefrightPlayer::initCheck() {
     46     ALOGV("initCheck");
     47     return OK;
     48 }
     49 
     50 status_t StagefrightPlayer::setUID(uid_t uid) {
     51     mPlayer->setUID(uid);
     52 
     53     return OK;
     54 }
     55 
     56 status_t StagefrightPlayer::setDataSource(
     57         const sp<IMediaHTTPService> &httpService,
     58         const char *url,
     59         const KeyedVector<String8, String8> *headers) {
     60     return mPlayer->setDataSource(httpService, url, headers);
     61 }
     62 
     63 // Warning: The filedescriptor passed into this method will only be valid until
     64 // the method returns, if you want to keep it, dup it!
     65 status_t StagefrightPlayer::setDataSource(int fd, int64_t offset, int64_t length) {
     66     ALOGV("setDataSource(%d, %lld, %lld)", fd, offset, length);
     67     return mPlayer->setDataSource(dup(fd), offset, length);
     68 }
     69 
     70 status_t StagefrightPlayer::setDataSource(const sp<IStreamSource> &source) {
     71     return mPlayer->setDataSource(source);
     72 }
     73 
     74 status_t StagefrightPlayer::setVideoSurfaceTexture(
     75         const sp<IGraphicBufferProducer> &bufferProducer) {
     76     ALOGV("setVideoSurfaceTexture");
     77 
     78     return mPlayer->setSurfaceTexture(bufferProducer);
     79 }
     80 
     81 status_t StagefrightPlayer::prepare() {
     82     return mPlayer->prepare();
     83 }
     84 
     85 status_t StagefrightPlayer::prepareAsync() {
     86     return mPlayer->prepareAsync();
     87 }
     88 
     89 status_t StagefrightPlayer::start() {
     90     ALOGV("start");
     91 
     92     return mPlayer->play();
     93 }
     94 
     95 status_t StagefrightPlayer::stop() {
     96     ALOGV("stop");
     97 
     98     return pause();  // what's the difference?
     99 }
    100 
    101 status_t StagefrightPlayer::pause() {
    102     ALOGV("pause");
    103 
    104     return mPlayer->pause();
    105 }
    106 
    107 bool StagefrightPlayer::isPlaying() {
    108     ALOGV("isPlaying");
    109     return mPlayer->isPlaying();
    110 }
    111 
    112 status_t StagefrightPlayer::seekTo(int msec) {
    113     ALOGV("seekTo %.2f secs", msec / 1E3);
    114 
    115     status_t err = mPlayer->seekTo((int64_t)msec * 1000);
    116 
    117     return err;
    118 }
    119 
    120 status_t StagefrightPlayer::getCurrentPosition(int *msec) {
    121     ALOGV("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 
    135 status_t StagefrightPlayer::getDuration(int *msec) {
    136     ALOGV("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 
    151 status_t StagefrightPlayer::reset() {
    152     ALOGV("reset");
    153 
    154     mPlayer->reset();
    155 
    156     return OK;
    157 }
    158 
    159 status_t StagefrightPlayer::setLooping(int loop) {
    160     ALOGV("setLooping");
    161 
    162     return mPlayer->setLooping(loop);
    163 }
    164 
    165 player_type StagefrightPlayer::playerType() {
    166     ALOGV("playerType");
    167     return STAGEFRIGHT_PLAYER;
    168 }
    169 
    170 status_t StagefrightPlayer::invoke(const Parcel &request, Parcel *reply) {
    171     ALOGV("invoke()");
    172     return mPlayer->invoke(request, reply);
    173 }
    174 
    175 void StagefrightPlayer::setAudioSink(const sp<AudioSink> &audioSink) {
    176     MediaPlayerInterface::setAudioSink(audioSink);
    177 
    178     mPlayer->setAudioSink(audioSink);
    179 }
    180 
    181 status_t StagefrightPlayer::setParameter(int key, const Parcel &request) {
    182     ALOGV("setParameter(key=%d)", key);
    183     return mPlayer->setParameter(key, request);
    184 }
    185 
    186 status_t StagefrightPlayer::getParameter(int key, Parcel *reply) {
    187     ALOGV("getParameter");
    188     return mPlayer->getParameter(key, reply);
    189 }
    190 
    191 status_t StagefrightPlayer::setPlaybackSettings(const AudioPlaybackRate &rate) {
    192     return mPlayer->setPlaybackSettings(rate);
    193 }
    194 
    195 status_t StagefrightPlayer::getPlaybackSettings(AudioPlaybackRate *rate /* nonnull */) {
    196     return mPlayer->getPlaybackSettings(rate);
    197 }
    198 
    199 status_t StagefrightPlayer::getMetadata(
    200         const media::Metadata::Filter& /* ids */, Parcel *records) {
    201     using media::Metadata;
    202 
    203     uint32_t flags = mPlayer->flags();
    204 
    205     Metadata metadata(records);
    206 
    207     metadata.appendBool(
    208             Metadata::kPauseAvailable,
    209             flags & MediaExtractor::CAN_PAUSE);
    210 
    211     metadata.appendBool(
    212             Metadata::kSeekBackwardAvailable,
    213             flags & MediaExtractor::CAN_SEEK_BACKWARD);
    214 
    215     metadata.appendBool(
    216             Metadata::kSeekForwardAvailable,
    217             flags & MediaExtractor::CAN_SEEK_FORWARD);
    218 
    219     metadata.appendBool(
    220             Metadata::kSeekAvailable,
    221             flags & MediaExtractor::CAN_SEEK);
    222 
    223     return OK;
    224 }
    225 
    226 status_t StagefrightPlayer::dump(int fd, const Vector<String16> &args) const {
    227     return mPlayer->dump(fd, args);
    228 }
    229 
    230 }  // namespace android
    231